Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用实体框架创建通用存储库?_C#_Git_Entity Framework_Generics - Fatal编程技术网

C# 如何使用实体框架创建通用存储库?

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

我已经用相同的格式编写了3个存储库。如何创建通用存储库

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实体并使用下面推荐的答案返回。这正是我想要的。谢谢