Шаблон репозитория я должен использовать ObjectSet <T>против IDbSet <T>для базового класса? - PullRequest
4 голосов
/ 29 ноября 2011

Я пытаюсь создать базовый класс репозитория на основе примера MyFinance, который сначала использует код Entity Framework.Я хотел бы изменить его на использование только Entity Framework.В примере используется IDbSet, но я понятия не имею, на что его можно изменить только для vanilla Entity Framework.Может быть ObjectSet<T>?Когда я использую ObjectSet<T>, я теряю некоторые методы, такие как GetById, так что, возможно, это не на 100% правильно.Любая помощь будет принята с благодарностью.

Пример базы данных репозитория с использованием кода Entity Framework сначала

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>();
} 

}

Что я думаю, яследует изменить его на 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>();
    }

}

1 Ответ

1 голос
/ 30 ноября 2011

ObjectSet<T> - предшественник DbSet<T> и связанный с ним интерфейс IDbSet<T>.Однако я не уверен, что вы обнаружили IObjectSet<T>, но вы правы, что вы должны использовать ObjectSet<T> вместо DbSet<T>.

...