用于在数据库中插入数据的存储库或服务-实体框架
本文关键字:服务 框架 实体 存储 数据库 插入 数据 用于 | 更新日期: 2023-09-27 18:04:39
如何使用实体框架创建新地址:
Op1:
IRepository<Address> _addressRepository;
并使用地址实体直接与数据库对话。
《凤凰社》第2章:
public bool CreateAddress(AddressDto addressDto);
与service方法对话以插入新的Address。
问题是,在项目的长期维护中,哪一个提供了更多的保证,不存在某人更改某些内容并破坏依赖于它的另一段代码的风险?
根据你的经验,哪一个是最好的方法?
根据我的经验,第二种方法效果最好。我喜欢有一个服务框架,在它的背后可以实现和调整业务逻辑,而不会影响到我的服务的消费者。顺便说一下,服务可以是域服务,web服务,web API。基本上,它是一个围绕业务逻辑和数据访问的外壳,只是公开了一些消费者可以调用的方法。
在我的视图中公开存储库方法泄露了太多信息。为什么消费层要知道存储库实现?您将永远与存储库模式绑定在一起。有很多关于EF和(通用)存储库的讨论。就我个人而言,我讨厌通用存储库。我喜欢从集合根的角度来思考。为每一种实体类型都设置一个存储库通常是一层太多了,它只会碍事。DbContext
中的DbSet
s是基本库。上下文完全适合作为一个工作单元。我倾向于直接在服务方法中使用上下文,而不是编排存储库和工作单元。当然,你可以使用存储库,但是要把它们隐藏在服务面板后面。
最后一点:我不会从服务方法返回一个布尔值,而是一个包含方法失败/成功信息的对象。例如:Web API中的HttpResponse
尝试像这样使用存储库:
public class Repository<T> : IRepository<T> where T : class
{
protected DbSet<T> DbSet;
public Repository(DbContext dataContext)
{
DbSet = dataContext.Set<T>();
}
#region IRepository<T> Members
public void Insert(T entity)
{
DbSet.Add(entity);
}
public void Delete(T entity)
{
DbSet.Remove(entity);
}
public IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate)
{
return DbSet.Where(predicate);
}
public IQueryable<T> GetAll()
{
return DbSet;
}
public T GetById(int id)
{
return DbSet.Find(id);
}
#endregion
}
当你需要一个新的address实例时,只需调用你的Repository来为你做这个:
var adressRepository = new Repository<Adress>(yourDataContext);
对于addressrepository只需执行:
adressRepository.Insert(yourAdressObject)
最后调用上下文的SaveChanges:
yourDataContext.SaveChanges();