使用存储库模式时,如何恢复数据库生成的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?