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;
    }
}
4

2 回答 2

2

DbContext只要您的“工作单元”处于活动状态,就应该保持活动状态。例如,如果您正在制作一个 Web 应用程序,它应该在请求开始时创建,最迟在请求结束时处理。

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

如果您没有很多域逻辑,我会将其直接添加到您的代码优先 POCO 实体中。这样,您仍然可以进行状态跟踪。

我建议使用 IoC 容器来管理您的DbContext. 以及存储库或您用于数据访问的任何东西的生命周期。也许与工作单元模式相结合。有很多可供选择,我最喜欢的一些是

有很多关于使用 IoC 容器管理生命周期的好教程,谷歌它!:)

于 2012-12-17T09:03:51.253 回答
1

要回答您的问题:

处理上下文好吗?

是的,上下文应该尽可能短(如果您有可能重组项目并实施更清洁的架构,请参阅@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();
        }
    }
}
于 2012-12-17T10:44:18.953 回答