在ASP.NET MVC项目中,我们是否应该采用Entity Framework Code First方法来重构我们的数据模型?
- 内容介绍
- 文章标签
- 相关推荐
本文共计557个文字,预计阅读时间需要3分钟。
我目前使用Entity Framework Code First方法开发了多个应用程序。所有应用都采用Data Repository模式。此模式单次查询即可获取单个实体。例如,我有两个模型:员工和部门。因此,为了获取所有员工,我使用了一次查询。
我有2个型号
员工和部门
因此,为了获取所有员工和部门,我将创建2个数据存储库实例.例如
var empRepository = new DataRepository<Employee>(); var allEmployees = empRepository.GetAll(); var depRepository = new DataRepository<Department>(); var alldepartment = depRepository.GetAll();
现在,这种模式在大多数情况下都很有效.现在,当我想要执行连接时,我无法在此模式中执行此操作.我只有在获取了两个实体的所有记录之后才能执行连接,然后我可以在内存数据上使用连接.这会在我的逻辑中产生2个查询的额外开销.是否有任何人具有可与DataRepository模式一起使用的良好模式或解决方案.请建议任何替代此模式.
实际上我昨天刚刚在我的通用存储库中实现了一个Join函数.这比每个人的实现方式要容易得多,并且您可以在这样做的同时使用Entity Framework的一些很酷的功能.首先,我使用的是类似于我在this blog post中编写的存储库.您会注意到许多方法正在返回IQueryable.这不是偶然的. IQueryable将允许仍然使用延迟执行,这意味着查询将不会在数据库上运行,直到某些东西强制它(即循环或.ToList()调用).你会看到,将Join加入这种类型的存储库,你不会最终需要将所有实体加载到内存中来进行连接,因为你所暴露的只是一个IQueryable.
话虽这么说,这就是我在Join方法的可查询版本的基础上加入我的存储库的方法:
public IQueryable<TResult> Join<TInner, TKey, TResult>(IRepository<TInner> innerRepository, Expression<Func<T, TKey>> outerSelector, Expression<Func<TInner, TKey>> innerSelector, Expression<Func<T, TInner, TResult>> resultSelector) where TInner : class { return DbSet.Join(innerRepository.All(), outerSelector, innerSelector, resultSelector); }
然后,这只对数据库进行一次查询以获取您正在请求的所有信息(同样,因为它只传递All()方法中的IQueryable).
本文共计557个文字,预计阅读时间需要3分钟。
我目前使用Entity Framework Code First方法开发了多个应用程序。所有应用都采用Data Repository模式。此模式单次查询即可获取单个实体。例如,我有两个模型:员工和部门。因此,为了获取所有员工,我使用了一次查询。
我有2个型号
员工和部门
因此,为了获取所有员工和部门,我将创建2个数据存储库实例.例如
var empRepository = new DataRepository<Employee>(); var allEmployees = empRepository.GetAll(); var depRepository = new DataRepository<Department>(); var alldepartment = depRepository.GetAll();
现在,这种模式在大多数情况下都很有效.现在,当我想要执行连接时,我无法在此模式中执行此操作.我只有在获取了两个实体的所有记录之后才能执行连接,然后我可以在内存数据上使用连接.这会在我的逻辑中产生2个查询的额外开销.是否有任何人具有可与DataRepository模式一起使用的良好模式或解决方案.请建议任何替代此模式.
实际上我昨天刚刚在我的通用存储库中实现了一个Join函数.这比每个人的实现方式要容易得多,并且您可以在这样做的同时使用Entity Framework的一些很酷的功能.首先,我使用的是类似于我在this blog post中编写的存储库.您会注意到许多方法正在返回IQueryable.这不是偶然的. IQueryable将允许仍然使用延迟执行,这意味着查询将不会在数据库上运行,直到某些东西强制它(即循环或.ToList()调用).你会看到,将Join加入这种类型的存储库,你不会最终需要将所有实体加载到内存中来进行连接,因为你所暴露的只是一个IQueryable.
话虽这么说,这就是我在Join方法的可查询版本的基础上加入我的存储库的方法:
public IQueryable<TResult> Join<TInner, TKey, TResult>(IRepository<TInner> innerRepository, Expression<Func<T, TKey>> outerSelector, Expression<Func<TInner, TKey>> innerSelector, Expression<Func<T, TInner, TResult>> resultSelector) where TInner : class { return DbSet.Join(innerRepository.All(), outerSelector, innerSelector, resultSelector); }
然后,这只对数据库进行一次查询以获取您正在请求的所有信息(同样,因为它只传递All()方法中的IQueryable).

