使用存储库模式时如何恢复数据库生成的ID?

时间:2016-04-26 14:42:50

标签: c# entity-framework

在我的解决方案中,我有一个Domain项目和一个DataAccess项目。 My Domain项目包含各种存储库的域对象和接口,以及包含所有存储库的UnitOfWork接口。我的DataAccess项目包含所有这些接口的实现以及我的Domain对象的EF版本。

因此,如果我有一个名为Person的类,并且我想在数据库中添加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<DataAccess.Entities.Person>(person);
  dbContext.People.Add(dbPerson);
}

Complete()函数只包含SaveChanges()。

public int Complete() {
  dbContext.SaveChanges();
}

通常,EF在插入后更新插入对象的DB生成的ID。但在这种情况下,EF对我的Domain Person对象一无所知。

由于我的Domain Person对象没有ID,我无法更新数据库条目或从数据库中重新获取它。

我能想到的唯一选择是在服务器上生成一个guid并将其用作ID。但是这会以两个ID的形式创建冗余。它也不是非常用户友好,因为用户将在搜索字段中引用此ID。记住ID 135比记住一个guid简单得多。

是否有某种方法可以让dbContext直接更新域对象的ID,或者让ID在各层中冒泡?

2 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情。

存储库

public class GenericRepository<TEntity> where TEntity : class
{
    internal DbContext context;
    internal DbSet<TEntity> dbSet;

    public GenericRepository(DbContext context)
    {
        this.context = context;
        this.dbSet = context.Set<TEntity>();
    }
    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的单独层,该层有助于使我的实体仅保留在存储库中,而所有来自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();
    }
}

答案 1 :(得分:0)

您可以在另一个类似的问题中检查我的答案,因为UnitofWork与存储库模式密切相关。

希望有帮助:

How to get id from Add using UnitOfWork pattern?