我认为有一些非常简单的事情,我遗漏或明显不理解。我正在尝试创建一个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
}