我已经完成了我可以在Entity和延迟加载上找到的所有读数,以及其他问题,但是对于我的生活,我无法使其工作。这是我的DB的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”对象,Entity从外键正确创建它。但是当我运行上面的代码时,“corp”总是返回NULL(即使我确定相关公司在DB中)。
我注意到的一件事是在自动生成的Entity Character对象中,它具有以下功能:
public virtual Corporation Corporation
{
get { return _corporation; }
set
{
if (!ReferenceEquals(_corporation, value))
{
var previousValue = _corporation;
_corporation = value;
FixupCorporation(previousValue);
}
}
}
这看起来很奇怪,因为我认为在延迟加载时,“get”函数会像“if null,尝试从数据库中获取公司”。任何想法都会受到高度赞赏。
*的 修改 * 请求如何配置延迟加载:
在我的Context类中,对于我有的每个构造函数
this.ContextOptions.LazyLoadingEnabled = true;
正如您从上面的第一个C#函数中看到的那样,我在函数本身中尝试将其设置为true,就在查询之前。
答案 0 :(得分:3)
延迟加载是对象上下文(在您的情况下为DBEntities类实例)提供的功能。因此,仅当实体对象附加到某个DBEntities实例时才会起作用。完成Character_GetByID方法时,将释放上下文,分离实体,并且无法执行延迟加载请求。
答案 1 :(得分:1)
删除using语句,就像使用此dbcontext时一样立即处理
using (var context = new DBEntities())
{
...
}//context is disposed here... lazy loading is not possible
答案 2 :(得分:0)
使用.Include(x => x.Corporation);
有关加载相关数据的一些信息。