【问题标题】:Attaching Reference navigation properties - Nopcommerce附加参考导航属性 - Nopcommerce
【发布时间】:2014-03-09 21:46:17
【问题描述】:

此问题专门针对 EMS nopcommerce。当我查看 EFRepository 中的 EF 实现时

https://nopcommerce.codeplex.com/SourceControl/latest#src/Libraries/Nop.Data/EfRepository.cs

我看到有一个属性

    protected virtual IDbSet<T> Entities
    {
        get
        {
            if (_entities == null)
                _entities = _context.Set<T>();
            return _entities;
        }
    }

我可以看到实体被设置为上下文。我看不到参考导航属性是如何设置的?任何外来关系都不会设置到上下文中吧??

【问题讨论】:

  • 设置“实体”和“参考导航属性”是什么意思?此方法只返回一个IDbSet。它没有设置任何东西。
  • 默认情况下 _entities 为空,因此当调用属性时,会执行 _context.Set() 行,将实体“设置”到上下文,但是任何附加的(参考导航属性)例如,如果 T = Customer,那么 Customer.Job 是否附加到上下文?

标签: c# entity-framework nopcommerce


【解决方案1】:

此构造只是存储库核心成员的延迟初始化:_entitiesDbSet&lt;T&gt;_entities 是在那里初始化还是在存储库的构造函数中初始化并不重要。它只是确保Entities 永远不会返回 null。 尚未设置其他对象。

在您对Entities 执行 LINQ 查询之前,实体不会物化并附加到上下文。比如

var rep = new EfRepository<Customer>();
var customers = rep.Entities.Include(c => c.Job).ToList();

现在 Customers 和他们的Jobs 从数据库中加载并附加到上下文中。

【讨论】:

  • 也许我需要添加更多信息,当我将实体添加到缓存中时,即客户及其关联的作业,然后我从缓存(内存缓存)中拉出该客户尝试访问作业和异常将通知我作业未附加到当前上下文...
  • 是的,你应该有。即使现在我也不清楚添加和从缓存中提取是什么意思。无论如何,如果你事先知道你需要对象它们的引用(或集合)Include 比延迟加载(通过添加virtual 启用)更好,因为延迟加载往往会使许多数据库往返。
  • 我同意,只要对延迟加载有所了解就可以了:)
【解决方案2】:

找到答案了!

这是因为并非我的所有属性都标记为虚拟,而且我使用的是 List 而不是 Collection。

:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多