实体框架代码首先在数据访问层中

时间:2012-12-17 08:36:15

标签: entity-framework c#-4.0 architecture entity-framework-4 entity-framework-4.1

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

2 个答案:

答案 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();
        }
    }
}