C# 存储库模式我应该使用ObjectSet<;T>;vs IDbSet<;T>;对于基类?

C# 存储库模式我应该使用ObjectSet<;T>;vs IDbSet<;T>;对于基类?,c#,entity-framework,entity-framework-4,repository-pattern,C#,Entity Framework,Entity Framework 4,Repository Pattern,我试图基于首先使用实体框架代码的MyFinance示例创建一个基本存储库类。我想把它改为只使用实体框架。该示例使用了IDbSet,但我不知道仅针对普通实体框架将其更改为什么。可能是ObjectSet?当我使用ObjectSet时,我丢失了一些方法,比如GetById,所以这可能不是100%正确。任何帮助都将不胜感激 首先使用实体框架代码的示例存储库库 public abstract class RepositoryBase<T> where T : class { private M

我试图基于首先使用实体框架代码的
MyFinance
示例创建一个基本存储库类。我想把它改为只使用实体框架。该示例使用了
IDbSet
,但我不知道仅针对普通实体框架将其更改为什么。可能是
ObjectSet
?当我使用
ObjectSet
时,我丢失了一些方法,比如
GetById
,所以这可能不是100%正确。任何帮助都将不胜感激

首先使用实体框架代码的示例存储库库

public abstract class RepositoryBase<T> where T : class
{
private MyFinanceContext dataContext;
private readonly IDbSet<T> dbset;
protected RepositoryBase(IDatabaseFactory databaseFactory)
{
    DatabaseFactory = databaseFactory;
    dbset = DataContext.Set<T>();
}

protected IDatabaseFactory DatabaseFactory
{
    get; private set;
}

protected MyFinanceContext DataContext
{
    get { return dataContext ?? (dataContext = DatabaseFactory.Get()); }
}
public virtual void Add(T entity)
{
    dbset.Add(entity);           
}
public virtual void Update(T entity)
{
    dbset.Attach(entity);
    dataContext.Entry(entity).State = EntityState.Modified;
}
public virtual void Delete(T entity)
{
    dbset.Remove(entity);           
}
public virtual void Delete(Expression<Func<T, bool>> where)
{
    IEnumerable<T> objects = dbset.Where<T>(where).AsEnumerable();
    foreach (T obj in objects)
        dbset.Remove(obj);
} 
public virtual T GetById(long id)
{
    return dbset.Find(id);
}
public virtual T GetById(string id)
{
    return dbset.Find(id);
}
public virtual IEnumerable<T> GetAll()
{
    return dbset.ToList();
}
public virtual IEnumerable<T> GetMany(Expression<Func<T, bool>> where)
{
    return dbset.Where(where).ToList();
}
public T Get(Expression<Func<T, bool>> where)
{
    return dbset.Where(where).FirstOrDefault<T>();
} 
公共抽象类RepositoryBase,其中T:class
{
私有MyFinanceContext数据上下文;
专用只读IDbSet数据库集;
受保护的RepositoryBase(IDatabaseFactory databaseFactory)
{
DatabaseFactory=DatabaseFactory;
dbset=DataContext.Set();
}
受保护的IDatabaseFactory数据库工厂
{
获得;私人设置;
}
受保护的MyFinanceContext数据上下文
{
获取{return dataContext???(dataContext=DatabaseFactory.get());}
}
公共虚拟空添加(T实体)
{
添加(实体);
}
公共虚拟无效更新(T实体)
{
附加数据集(实体);
dataContext.Entry(entity).State=EntityState.Modified;
}
公共虚拟作废删除(T实体)
{
删除(实体);
}
公共虚拟void Delete(表达式where)
{
IEnumerable objects=dbset.Where(Where).AsEnumerable();
foreach(对象中的对象)
dbset.Remove(obj);
} 
公共虚拟T GetById(长id)
{
返回dbset.Find(id);
}
公共虚拟T GetById(字符串id)
{
返回dbset.Find(id);
}
公共虚拟IEnumerable GetAll()
{
返回dbset.ToList();
}
公共虚拟IEnumerable GetMany(表达式,其中)
{
返回dbset.Where(Where.ToList();
}
公共不获取(表达式在何处)
{
返回dbset.Where(Where.FirstOrDefault();
} 
}

我认为应该将其更改为适用于EntityFramework的内容

public abstract class BaseRepository<T> where T : class
{
    private MyDBContainer _dataContext;
    private readonly ObjectSet<T> dbset;

    protected BaseRepository(IDatabaseFactory databaseFactory)
    {
        DatabaseFactory = databaseFactory;
        dbset = DataContext.CreateObjectSet<T>();
    }

    protected IDatabaseFactory DatabaseFactory
    {
        get;
        private set;
    }

    protected MyDBContainer DataContext
    {
        get { return _dataContext ?? (_dataContext = DatabaseFactory.DataContext); }
    }
    public virtual void Add(T entity)
    {
        dbset.AddObject(entity);
    }
    //public virtual void Update(T entity)
    //{
    //    dbset.Attach(entity);
    //    _dataContext.Entry(entity).State = EntityState.Modified;
    //}
    public virtual void Delete(T entity)
    {
        dbset.DeleteObject(entity);
    }
    public virtual void Delete(Expression<Func<T, bool>> where)
    {
        IEnumerable<T> objects = dbset.Where<T>(where).AsEnumerable();
        foreach (T obj in objects)
            dbset.DeleteObject(obj);
    }
    //public virtual T GetById(long id)
    //{
    //    return dbset.(id);
    //}
    //public virtual T GetById(string id)
    //{
    //    return dbset.Find(id);
    //}
    public virtual IEnumerable<T> GetAll()
    {
        return dbset.ToList();
    }
    public virtual IEnumerable<T> GetMany(Expression<Func<T, bool>> where)
    {
        return dbset.Where(where).ToList();
    }
    public T Get(Expression<Func<T, bool>> where)
    {
        return dbset.Where(where).FirstOrDefault<T>();
    }

}
公共抽象类BaseRepository,其中T:class
{
私有MyDBContainer_dataContext;
私有只读对象集dbset;
受保护的BaseRepository(IDatabaseFactory databaseFactory)
{
DatabaseFactory=DatabaseFactory;
dbset=DataContext.CreateObjectSet();
}
受保护的IDatabaseFactory数据库工厂
{
得到;
私人设置;
}
受保护的MyDBContainer数据上下文
{
获取{return}dataContext???(_dataContext=DatabaseFactory.dataContext);}
}
公共虚拟空添加(T实体)
{
添加对象(实体);
}
//公共虚拟无效更新(T实体)
//{
//附加数据集(实体);
//_dataContext.Entry(entity).State=EntityState.Modified;
//}
公共虚拟作废删除(T实体)
{
dbset.DeleteObject(实体);
}
公共虚拟void Delete(表达式where)
{
IEnumerable objects=dbset.Where(Where).AsEnumerable();
foreach(对象中的对象)
dbset.DeleteObject(obj);
}
//公共虚拟T GetById(长id)
//{
//返回dbset(id);
//}
//公共虚拟T GetById(字符串id)
//{
//返回dbset.Find(id);
//}
公共虚拟IEnumerable GetAll()
{
返回dbset.ToList();
}
公共虚拟IEnumerable GetMany(表达式,其中)
{
返回dbset.Where(Where.ToList();
}
公共不获取(表达式在何处)
{
返回dbset.Where(Where.FirstOrDefault();
}
}

ObjectSet
DbSet
及其相关接口
IDbSet
的前身。然而,我不确定您是否发现了一个
ioobjectset
,但是您应该使用
ObjectSet
来代替
DbSet

作为您所做工作的旁注,我强烈建议您不要将这些存储库传递给您的服务层。我将包含它们对PeopleService之类的东西的所有用法,它可以使用1到多个存储库。我也不会从BaseRepository继承,这个类足够好,可以作为一等公民生活。然后,您可以使用诸如StructureMap之类的IOC框架将它们连接在一起。我写了一篇关于如何使用NH的博客,同样的概念也适用:你的更新和GetById呢?你的Get似乎有这种逻辑。更新呢?