C# 如何使用实体框架创建通用存储库?
我已经用相同的格式编写了3个存储库。如何创建通用存储库C# 如何使用实体框架创建通用存储库?,c#,git,entity-framework,generics,C#,Git,Entity Framework,Generics,我已经用相同的格式编写了3个存储库。如何创建通用存储库 public class MyRepository : MyDataRepositoryBase<ASD> { protected override ASD AddEntity(MyDataContext entityContext, ASD entity) { return entityContext.ASDSet.Add(entity); } protected overri
public class MyRepository : MyDataRepositoryBase<ASD>
{
protected override ASD AddEntity(MyDataContext entityContext, ASD entity)
{
return entityContext.ASDSet.Add(entity);
}
protected override IEnumerable<ASD> GetEntities(MyDataContext entityContext)
{
return from e in entityContext.ASDSet
select e;
}
}
公共类MyRepository:MyDataRepositoryBase
{
受保护的覆盖ASD附加项(MyDataContext entityContext,ASD实体)
{
返回entityContext.ASDSet.Add(实体);
}
受保护的覆盖IEnumerable GetEntities(MyDataContext entityContext)
{
从entityContext.ASDSet中的e返回
选择e;
}
}
这就是我目前所处的位置
public class ComponentsRepository<T, U>:MyDataRepositoryBase<T>
where T : class,new()
where U : DbSet<U>, new()
{
protected override T AddEntity(MyDataContext entityContext, T entity)
{
return entityContext.U.Add(entity);
}
}
公共类组件存储:MyDataRepositoryBase
其中T:class,new()
其中U:DbSet,new()
{
受保护的覆盖T AddEntity(MyDataContext entityContext,T entity)
{
返回entityContext.U.Add(实体);
}
}
我基本上是想找到一种方法来调用DbSet“entityContext.ASDSet”,而不知道它是什么
有什么想法或者我应该放手…实体框架有一套方法,所以您可以这样做
return entityContext.Set<T>().Add(entity);
返回entityContext.Set().Add(实体);
但它不会检查您是否传入了未映射的类。因此,使用它的风险由您自己承担,如果未映射,它将抛出异常。我们有一个所有实体都从中继承的基类,因此我们对其进行了限制,但即使不能保证类映射到实体框架中。因为通用存储库是一个反模式。这是我以前使用的实现:
public class Repository<T> : IRepository<T> where T : class
{
private readonly IDbContext _context;
private readonly IDbSet<T> _dbSet;
public Repository(IDbContext context) {
_context = context;
_dbSet = context.Set<T>();
}
public void Add(T entity) {
_dbSet.Add(entity);
}
public void Update(T entity) {
_context.Entry(entity).State = EntityState.Modified;
}
...
}
公共类存储库:IRepository,其中T:class
{
私有只读IDbContext _context;
专用只读IDbSet _dbSet;
公共存储库(IDbContext上下文){
_上下文=上下文;
_dbSet=context.Set();
}
公共无效添加(T实体){
_添加(实体);
}
公共无效更新(T实体){
_context.Entry(entity.State=EntityState.Modified;
}
...
}
我的背景:
public interface IDbContext
{
IDbSet<T> Set<T>() where T : class;
DbEntityEntry Entry<T>(T entity) where T : class;
int SaveChanges();
...
}
公共接口IDbContext
{
IDbSet Set(),其中T:class;
DbEntityEntry条目(T实体),其中T:类;
int SaveChanges();
...
}
我将其用于一个工作单元,通过该单元进行保存和存储库检索。也就是说,我确实发现在我的实体周围创建存储库要干净得多。只是一个链接:
DbSet
是一个通用存储库。我所做的就是删除DbSet实体并使用下面推荐的答案返回。这正是我想要的。谢谢