在我的解决方案中,我有一个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在各层中冒泡?
答案 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)