1

我在我的项目中使用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; 
    } 
} 

回答

1

回答您的问题:

是好处置的背景?

是的,上下文应该尽可能短暂(有关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(); 
     } 
    } 
} 
2

DbContext应保持活着,只要你的“工作单位”是积极的。例如。如果您正在制作Web应用程序,则应在请求开始时创建,并在请求结束时最迟处理。

在你的情况下,DbContext应保持活着,直到你完成填充您的域模型,否则其正在lazy loaded导航属性将null,正如你所提到。当您填充模型时,通过处置DbContext来“分离”您的实体的缺点是您失去了实体的状态跟踪,并且当您要保存数据时,您将需要自己执行此操作。

如果您没有批次域逻辑我只是将它直接添加到您的代码优先POCO实体。这样,你仍然可以进行状态跟踪。

我会推荐使用IoC容器来管理您的DbContext的生命周期,以及存储库或您用于数据访问的任何内容。可能结合Unit of Work pattern。有很多可以选择,我的一些最喜欢的是

有很多很好的教程中使用IoC容器管理一生,google一下! :)