Entity framework 在我的存储库方法中加入联接和其他复杂操作是一种好的做法吗?
我正在用C#在ASP.NET MVC3中开发一个应用程序 我目前正在构建我的DAL,它由ADO.NET EF和一个存储库类Entity framework 在我的存储库方法中加入联接和其他复杂操作是一种好的做法吗?,entity-framework,repository-pattern,abstraction,Entity Framework,Repository Pattern,Abstraction,我正在用C#在ASP.NET MVC3中开发一个应用程序 我目前正在构建我的DAL,它由ADO.NET EF和一个存储库类MyDBRepository组成: public class MyDBRepository { MyDBEntities myDB; public MinervaDBRepository() { myDB = new MyDBEntities(); } //methods } 我仍然不确定MyDBRepositor
MyDBRepository
组成:
public class MyDBRepository
{
MyDBEntities myDB;
public MinervaDBRepository()
{
myDB = new MyDBEntities();
}
//methods
}
我仍然不确定MyDBRepository
方法执行的查询的详细程度。我知道此查询适用于存储库:
public IQueryable<Products> GetAllTickets()
{
return myDB.products;
}
此方法使用导航属性执行连接,以检索构成产品的所有零件(假设存在1对多关系):
公共IQueryable GetAllProductParts(int-productId)
{
返回myDB.products.Where(m=>等于(m.ProductId,ProductId));
}
它们是在存储库类中实现还是最好(一个或两个)移动到服务层?存储库封装了持久层,在那里实现与数据库相关的所有内容是正常的。实际执行情况不一致;对于应用程序的其余部分来说并不重要,这就是为什么您首先要使用存储库。我唯一建议更改的是直接返回IEnumerable,而不是IQueryable 它们之间有区别,但在这种情况下这并不重要,使用IQueryable意味着将来更难更改持久性访问(例如,您可能希望切换到micro orm或更改驱动程序不支持IQueryable的RDBMS,或者只使用云存储)
public IQueryable<Products> GetProductsDismissed(DateTime date)
{
return myDB.products.Where(m => (string.IsNullOrEmpty(m.ProductDismissDate) ||
Equals(m.ProductDismissDate, "-")) ? false :
(DateTime.Compare(date, DateUtilities.ConvertToDateTime(m.ProductDismissDate)) > 0));
}
public IQueryable<Products> GetAllProductParts(int productId)
{
return myDB.products.Where(m => Equals(m.ProductId, productId));
}