我正在使用通用存储库来开发我自己的BLL with entity framework。Generic Repository但是所有通用存储库都没有内部连接。 Lokk下面:
public interface IRepository
{
IQueryable<T> List<T>() where T : class;
T Get<T>(int id) where T : class;
void Create<T>(T entityTOCreate) where T : class;
void Edit<T>(T entityToEdit) where T : class;
void Delete<T>(T entityToDelete) where T : class;
}
如何将上述代码转换为:
public interface IRepository
{
IQueryable<T> List<T>() where T : class;
T Get<T>(int id) where T : class;
void Create<T>(T entityTOCreate) where T : class;
void Edit<T>(T entityToEdit) where T : class;
void Delete<T>(T entityToDelete) where T : class;
void InnerJoin<T>(T entityName, TNew entityName2) where T : class, where TNew : class;
}
或者我认为我们可以像这样使用Fluent interfacve模式:
public List<MyWorker> ListByID( int ID)
{
using (var Ctx = new DomainRepository<Worker>(new ProposalsEntities()))
return Ctx.Find<Worker>(q => q.ID== ID).ToList().InnerJoin(XEntity,x=>x.ID=q.ID).InnerJoin(YEntity,y=>y.ID=q.ID);
}
Yu可以给出另一个建议来实现这个奇妙的问题。如何在Generic Repository中编写上面的连接代码?
答案 0 :(得分:4)
您的通用存储库无法做到这一点。抽象数据库的关系模型并不是一个好主意。它会阻止您使用特定于数据库的功能,例如...连接。
您可以通过添加额外的方法修复您的存储库:
IQueryable<T> Query<T>() { return dataContext.GetTable<T>(); }
(此示例适用于Linq 2 Sql)。
您需要能够为callerd提供可组合查询,而不是列表。然后呼叫者可以写:
from w in repo.Query<Worker>()
join e in repo.Query<XEntity>() on ...
如果允许注释:通用存储库模式不是一个好主意。它没有什么帮助,但造成很大的伤害。
直接直接使用DataContext / EntityContext / Session或使用专门的存储库。
答案 1 :(得分:0)
存储库不应公开连接功能。存储库提供的域对象可能由持久存储在多个表中的数据组成,但域层不应该知道这一事实,或者更一般地说,应该知道数据在持久层中采用的格式。某些数据源甚至可能无法提供连接功能。