通用存储库 - 带有Linq到实体的MVC 4

时间:2013-07-26 14:24:32

标签: c# entity-framework asp.net-mvc-4 linq-to-entities repository-pattern

我认为有一些非常简单的事情,我遗漏或明显不理解。我正在尝试创建一个MVC 4项目,该项目将EF与数据库生成的模型结合使用。我试图遵循UnitOfWork / Repository设计模式。

我有一个通用存储库的接口:

public interface IRepository<T>
{
    IEnumerable<T> GetAll();
    IEnumerable<T> Find(Expression<Func<T, bool>> predicate);        
    T First(Expression<Func<T, bool>> predicate);
    T FirstOrDefault(Expression<Func<T, bool>> predicate);
    T GetById(int id);

    void Add(T entity);
    void Delete(T entity);        
}

以下是UnitOfWork的界面(注意:主题是我的EF模型中的实体):

public interface IUnitOfWork : IDisposable
{

    IRepository<Topic> TopicRepository { get; }        

    void Commit();
}

我正在实施IRepository:

public class Repository<T> : IRepository<T>
                    where T : class
{
    private readonly DbSet<T> _db;

    public Repository(DbSet<T> db)
    {
        this._db = db;
    }

    public IQueryable<T> AsQueryable()
    {
        throw new NotImplementedException();
    }

    public IEnumerable<T> GetAll()
    {
        return this._db;            
    }

    ... etc
}

这是UnitOfWork类的实现:

    public class UnitOfWork : DbContext, IUnitOfWork
{
    private readonly Repository<Topic> _TopicRepository;

    public DbSet<Topic> Topics { get; set; }

    public UnitOfWork()
    {            
        this._TopicRepository = new Repository<Topic>(Topics);
    }


    public IRepository<Topic> TopicRepository
    {
        get { return this._TopicRepository; }
    }

    public void Commit()
    {
        this.SaveChanges();
    }
}

我在打电话:

this._unitOfWork.TopicRepository.GetAll();

当数据库中至少存在2个时,返回零主题。我的问题是我假设这是完全合理的,因为我没有定义或关联DbSet与EF模型生成的CommonGoodEntities(通过添加模型生成的类)相关联,但是我如何关联这两者?

我希望这是有道理的。基本上我希望UnitOfWork类使用我的Entities类 我是以错误的方式解决这个问题吗?

提前多多感谢。

编辑:

我根据SimonBelanger的评论更新了工作单元。在这样做后,我能够使用下面的代码,但是,我不确定它是100%正确。这是我应该做的吗?

public class UnitOfWork : IUnitOfWork
{
    private readonly Repository<Topic> _TopicRepository;
    private CommonGoodEntities _db;

    public DbSet<Topic> Topics { get; set; }

    public UnitOfWork()
    {
        this._db = new CommonGoodEntities();
        //this._TopicRepository = new Repository<Topic>(Topics);
        this._TopicRepository = new Repository<Topic>(this._db.Set<Topic>());
    }

    ... etc

}

0 个答案:

没有答案