我在我的项目中使用N层架构。在数据访问层中,我首先使用实体框架代码。 当我在DAL中填充对象时,处理上下文并将对象传输到业务层,导航属性变为null。 如果我不处理上下文,我没有问题,但我的问题是处理好 上下文? 如果是,当我将对象传输到下一层(业务)时,如何解决问题,以便导航属性不会变为空。 我的数据访问层代码:
public List<DomainObject.ContractCenter> GetAll()
{
try
{
List<ContractCenter> contractCenters = new List<ContractCenter>();
using (var context = new DBContext())
{
contractCenters = context.ContractCenters.ToList();
}
return contractCenters;
}
}
答案 0 :(得分:2)
只要您的“工作单位”处于活动状态,DbContext
就应该保持活跃状态。例如。如果您正在创建Web应用程序,则应在请求开始时创建它,并在请求结束时最迟处理。
在您的情况下,DbContext
应保持活动状态,直到您完成填充域模型,否则lazy loaded的导航属性将为null
,就像您一样提及。在填充模型时通过部署DbContext
来“分离”实体的缺点是您丢失了对实体的状态跟踪,并且当您想要保存数据时,您需要自己执行此操作。
如果您没有 lot 域逻辑,我只需将其直接添加到代码优先的POCO实体中。这样,您仍然可以进行状态跟踪。
我建议使用IoC容器来管理DbContext
的生命周期,以及存储库或用于数据访问的任何内容。也许与Unit of Work pattern结合使用。有很多可供选择,我最喜欢的是
有很多很好的教程可以使用IoC容器管理生命周期,谷歌吧! :)
答案 1 :(得分:1)
回答你的问题:
处理上下文是否合适?
是的,上下文应尽可能短暂(如果您有可能重新构建项目并实现更清晰的架构,请参阅@khellang关于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();
}
}
}