【问题标题】:C# Entity Framework Lazy Loading Isn't LoadingC# 实体框架延迟加载未加载
【发布时间】:2015-11-18 11:18:35
【问题描述】:

我已经完成了所有关于实体和延迟加载的阅读,以及这里的其他问题,但对于我的生活,我无法得到这个工作。这是我的数据库 SQL:

CREATE TABLE corporations(
corporationID bigint PRIMARY KEY
);

CREATE TABLE Character(
personID bigint PRIMARY KEY,
corporationID int NOT NULL,
FOREIGN KEY (corporationID) REFERENCES corporations(corporationID)
);

以及获取它的实体代码(*已从原始版本编辑,仍然损坏*):

DBEntities context = new DBEntities();
public Character Character_GetByID(long CharacterID)
        {
            context.ContextOptions.LazyLoadingEnabled = true;
            Character character = context.Characters.Where(c => c.CharacterID == CharacterID).FirstOrDefault();      
            return character;
        }

所以根据我的理解,有了这个我应该可以去

Character char = Character_GetByID(characterID);
Corporation corp = char.Corporation;

“char.Corporation”对象存在,实体从外键正确创建它。但是当我运行上面的代码时,“corp”总是返回为 NULL(即使我确定相关的公司在数据库中)。

我注意到的一件事是,在自动生成的 Entity Character 对象中,它具有以下功能:

public virtual Corporation Corporation
        {
            get { return _corporation; }
            set
            {
                if (!ReferenceEquals(_corporation, value))
                {
                    var previousValue = _corporation;
                    _corporation = value;
                    FixupCorporation(previousValue);
                }
            }
        }

这看起来很奇怪,因为我假设通过延迟加载,“get”函数会类似于“如果为 null,则尝试从数据库中获取 Corporation”。任何想法将不胜感激。

*编辑* 请求如何配置延迟加载:

在我的 Context 类中,对于我拥有的每个构造函数

this.ContextOptions.LazyLoadingEnabled = true;

从上面的第一个 C# 函数可以看出,我尝试在函数本身中将其设置为 true,就在查询它之前。

【问题讨论】:

  • 您能粘贴一下您是如何配置延迟加载的吗?
  • 使用 .Include(x=> x.Corporation) ;
  • @ivowiblo:我添加了一个编辑以显示我对 LazyLoading 配置所做的工作,但如果其他地方有配置,我想我不知道
  • @Greens:是的,我试过了,它奏效了,但这是一个糟糕的解决方法,因为我不希望它总是加载这些数据(原因是这只是一个例子许多 Entity 对象,它们都不起作用,有些有非常大的数据集,我不想总是加载它们,因为它们很少使用)
  • 当您尝试通过延迟加载访问数据时,您的 DbContext 是否仍然存在(未释放)?

标签: c# asp.net entity-framework lazy-loading


【解决方案1】:

延迟加载是对象上下文(在您的情况下为 DBEntities 类实例)提供的功能。因此,它仅在实体对象附加到某些 DBEntities 实例时才起作用。当 Character_GetByID 方法完成后,上下文被释放,实体被分离,你的延迟加载请求将无法执行。

【讨论】:

  • 所以我继续并摆脱了“使用(var context = new DBEntities())”并通过在整个类中设置一个私有变量来替换它(所以当方法退出时它不会被释放)。不幸的是,它仍然无法正常工作......
  • 全部修复!上下文仍在以某种方式处理,但让它工作。感谢您的帮助!
  • 但是你仍然在某个地方处理你的上下文,对吧?因为如果不这样做,您将度过一段糟糕的时光。
【解决方案2】:

去掉 using 语句,因为当你使用时,这个 dbcontext 就被释放了

using (var context = new DBEntities())
{
   ...
}//context is disposed here... lazy loading is not possible

【讨论】:

    【解决方案3】:

    【讨论】:

    • 是的,我试过了,它奏效了,但这是一个糟糕的解决方法,因为我不希望它总是加载这些数据(原因是这只是许多实体对象的一个​​例子,其中一个都不起作用,而且有些数据集非常大,我不想总是加载,因为它们很少使用)
    • @Greens,这是急切加载,而不是懒惰。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多