C# 实体框架延迟加载未加载

本文关键字:加载 延迟加载 框架 实体 | 更新日期: 2023-09-27 18:33:44

我已经完成了我能找到的关于实体和延迟加载的所有阅读,以及这里的其他问题,但对于我的生活,我无法让它工作。这是我的数据库 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;

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

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

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

这似乎很奇怪,因为我假设使用延迟加载时,"get"函数类似于"如果为空,请尝试从数据库中获取公司"。任何想法将不胜感激。

*

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

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

this.ContextOptions.LazyLoadingEnabled = true;

正如您从上面的第一个 C# 函数中看到的那样,在查询它之前,我尝试在函数本身中将其设置为 true。

C# 实体框架延迟加载未加载

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

删除 using 语句,因为当您使用此 dbcontext 时,会立即释放

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

使用 .包括(x=> x.公司( ;

有关加载相关数据的一些信息。

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-application