【问题标题】: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();
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多