【问题标题】:Entity Framework code first in data access layer实体框架代码首先在数据访问层
【发布时间】:2012-12-17 08:36:14
【问题描述】:
我在我的项目中使用 N 层架构。在数据访问层,我首先使用实体框架代码。
当我在 DAL 中填充对象、处理上下文并将对象传输到业务层时,导航属性变为空。
如果我不处理上下文,我没有问题,但我的问题是处理好
上下文?
如果是,当我将对象转移到下一层(业务)时,如何解决问题,使导航属性不会变为空。
我在数据访问层的代码:
public List<DomainObject.ContractCenter> GetAll()
{
try
{
List<ContractCenter> contractCenters = new List<ContractCenter>();
using (var context = new DBContext())
{
contractCenters = context.ContractCenters.ToList();
}
return contractCenters;
}
}
【问题讨论】:
标签:
entity-framework
c#-4.0
architecture
entity-framework-4
entity-framework-4.1
【解决方案1】:
只要您的“工作单元”处于活动状态,DbContext 就应该保持活动状态。例如。如果您正在制作一个 Web 应用程序,它应该在请求开始时创建,最迟在请求结束时处理。
在您的情况下,DbContext 应该保持活动状态,直到您完成填充域模型,否则 lazy loaded 的导航属性将是 null,正如您所提到的。在填充模型时通过处置DbContext“分离”实体的缺点是您会丢失对实体的状态跟踪,当您想要保存数据时需要自己执行此操作。
如果您没有 很多 域逻辑,我会将其直接添加到您的代码优先 POCO 实体中。这样,您仍然可以进行状态跟踪。
我建议使用 IoC 容器来管理您的 DbContext 以及存储库或您用于数据访问的任何东西的生命周期。也许与Unit of Work pattern 结合使用。有很多可供选择,我最喜欢的一些是
有很多关于使用 IoC 容器管理生命周期的好教程,谷歌一下! :)
【解决方案2】:
回答您的问题:
处置上下文好不好?
是的,上下文应该尽可能短(如果您有可能重组项目并实施更清洁的架构,请参阅@khillang 关于 UnitOfWork 和 IOC 的回答)。
当我将对象转移到下一层时,我该如何解决这个问题
您需要预先加载相关的集合(导航属性):
public List<DomainObject.ContractCenter> GetAll()
{
try
{
using (var context = new DBContext())
{
return context.ContractCenters.
Include(c => c.YourChildCollection1).
Include(c => c.YourChildCollection2).
...
ToList();
}
}
}