使用存储库模式时,如何恢复数据库生成的ID?
在我的解决方案中,我有一个Domain项目和一个DataAccess项目。 My Domain项目包含各种存储库的域对象和接口,以及包含所有存储库的UnitOfWork的接口。 我的DataAccess项目包含所有这些接口的实现以及我的Domain对象的EF版本。
因此,如果我有一个名为Person
的类,并且我想向DB添加一个Person
,它将如下所示:
unitOfWork.People.Add(person); unitOfWork.Complete();
内部unitOfWork.People.Add(person)
我使用AutoMapper将我的域Person
对象映射到我的EF Person
对象。 然后我将EF Person
对象添加到EF DbContext
对象。
public void Add(Person person) { DataAccess.Entities.Person dbPerson = Mapper.Map(person); dbContext.People.Add(dbPerson); }
Complete()函数只包含SaveChanges()。
public int Complete() { dbContext.SaveChanges(); }
通常,EF在插入后更新插入对象的DB生成的ID。 但在这种情况下,EF对我的Domain Person对象一无所知。
由于我的Domain Person对象没有它的ID,我无法更新数据库条目或从数据库中重新获取它。
我能想到的唯一选择是在服务器上生成一个guid并将其用作ID。 但这会以两个ID的forms创建冗余。 它也不是非常用户友好,因为用户将在搜索字段中引用此ID。 记住ID 135比记住guid简单得多。
是否有某种方法可以让dbContext直接更新域对象的ID,或者让ID通过层向上冒泡?
你可以尝试这样的事情。
知识库
public class GenericRepository where TEntity : class { internal DbContext context; internal DbSet dbSet; public GenericRepository(DbContext context) { this.context = context; this.dbSet = context.Set (); } public virtual TEntity Insert(TEntity entity) { dbSet.Add(entity); return entity; } }
像这样使用它
var uow = new UnitOfWork(); var added = uow.StudentReposiotry.Insert(new Student { Name = "Repository", RegistrationNo = "BSE-2018-004", Date = DateTime.Now, Department = "Philosphy", Email = "test@" }); uow.Save(); //if its saved. long id = added.Id;
我添加了一个名为DataProvider的单独层,它有助于保持我的实体只在Repository中存在,所有来自DataProvider的内容都讲述了DTO。
public class StudentDataProvider : DataProviderBase { public StudentDto Insert(Student dto) { var entity = new Student{ Name = dto.Name,Deparment= dto.Deparment}; var addedItem = unitofwork.StudentReposiotry.Insert(entity); unitofWork.Save(); dto.Id = addedItem.Id; return dto; } public StudentDto AddAndUpdate(StudentDto dto, StudentDto updateDto) { var entity = new Student{ Name = dto.Name,Deparment= dto.Deparment}; var update= new Student{ Name = updateDto.Name,Deparment= updateDto.Deparment}; var addedItem = unitofwork.StudentReposiotry.Insert(entity); var updateItem= unitofwork.StudentReposiotry.Update(update) unitofWork.Save(); dto.Id = addedItem.Id; return dto; } } public class DataProvideBase { protected IUnitOfWork UnitOfWork; public DataProvideBase() { UnitOfWork = new UnitOfWork(); } }
您可以在另一个类似的问题中检查我的anser,因为UnitofWork与存储库模式有关。
希望能帮助到你:
如何使用UnitOfWork模式从Add获取id?
- 将Ping应用程序转换为multithreading版本以提高速度 – C#
- IMetaDataImport :: ResolveTypeRef方法的问题
- 数据绑定是否支持Windows窗体中的嵌套属性?
- 在Code Behind中动态更改XAML样式,以便应用该样式的控件也反映了更改
- 如何只保留DateTime的日期部分,同时保留时间部分?
- 桌面软件中的Onenote OCRfunction
- GetCallingAssembly()和GetExecutingAssembly()是否同样倾向于JIT内联?
- 使用C#将XML直接保存到数据库
- 序列化List 的XmlSerializer的构造函数在与XmlAttributeOverrides一起使用时会抛出InvalidOperationException