gpt4 book ai didi

c# - 使用存储库模式时如何取回数据库生成的 ID?

转载 作者:行者123 更新时间:2023-11-30 12:41:41 25 4
gpt4 key购买 nike

在我的解决方案中,我有一个域项目和一个数据访问项目。 My Domain 项目包含各种存储库的域对象和接口(interface),以及包含我所有存储库的 UnitOfWork 的接口(interface)。我的 DataAccess 项目包含所有这些接口(interface)的实现和我的域对象的 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 会在插入后更新插入对象的数据库生成的 ID。但在这种情况下,EF 对我的 Domain Person 对象一无所知。

因为我的域人员对象没有它的 ID,所以我无法更新数据库条目或从数据库中重新获取它。

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

有没有办法让 dbContext 直接更新域对象的 ID,或者让 ID 在层中向上冒泡?

最佳答案

你可以尝试这样的事情。

存储库

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 的单独层,它有助于让我的实体仅在 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();
}
}

关于c# - 使用存储库模式时如何取回数据库生成的 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36868254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com