Entity framework 将对象添加到上下文并从关系中获取属性
我不久前编写了一些代码,首先使用实体框架代码将对象添加到表中Entity framework 将对象添加到上下文并从关系中获取属性,entity-framework,entity-framework-4.1,ef-code-first,entity-relationship,code-first,Entity Framework,Entity Framework 4.1,Ef Code First,Entity Relationship,Code First,我不久前编写了一些代码,首先使用实体框架代码将对象添加到表中 Context.Reactions.Attach(reaction); Context.SaveChanges(); 之后,我使用一个名为Profile的关系来获取发布反应的用户的姓名 reaction.Profile.FirstName + " " + reaction.Profile.LastName 现在过了一段时间,当我试图获取此人的姓名时,我在个人资料上得到了一个空引用 那么为什么我不能添加一个对象,然后再使用Profi
Context.Reactions.Attach(reaction);
Context.SaveChanges();
之后,我使用一个名为Profile的关系来获取发布反应的用户的姓名
reaction.Profile.FirstName + " " + reaction.Profile.LastName
现在过了一段时间,当我试图获取此人的姓名时,我在个人资料上得到了一个空引用
那么为什么我不能添加一个对象,然后再使用Profile关系呢
编辑:
我正在获取配置文件关系属性的nullreference。所以反应,档案上说是空的。这是同一个例子。实体框架给了我一个反应的id,因此savechanges()可以工作。
获取FirstName的行是SaveChanges之后的直接行,因此无法正确处理上下文
完整代码:
var reaction = new Reaction()
{
Text = reactionText,
ProfileId = CurrentProfileId,
PostedOn = DateTime.Now
};
//Save changes to the backend
context.Reactions.Add(reaction);
context.SaveChanges();
return Json(new
{
Id = reaction.Id,
ReactionType = reactionType,
ReactionTypeId = reactionTypeId,
ReactionText = reaction.Text,
PostedOn = reaction.PostedOn.ToString("G"),
ProfileName = string.Format("{0} {1}", reaction.Profile.FirstName, reaction.Profile.LastName)
});
我甚至试着用这个代码来解释它
using (var context = new SeeTingsContext())
{
context.Configuration.LazyLoadingEnabled = true;
}
过了一会儿,当我读到
时,我没有完全理解你的意思。这是否意味着您首先获取关系对象,然后它突然变为null?
我的猜测是:
- 对于您正在处理的上下文,您尚未将
LazyLoadingEnabled
设置为true李>
- 您的上下文已被释放,因此您无法使用它来获取关系。请注意,可以在上下文仍然存在时使用延迟加载李>
更新:根据注释,尝试显式加载关系,查看是否可以获取配置文件:
if (!context.Entry(reaction).Reference(r => r.Profile).IsLoaded)
{
context.Entry(reaction).Reference(r => r.Profile).Load();
}
如果您无法使用这种方式获取概要文件,我想您的映射可能有问题。您在同一个反应实例上获得了null reference异常?不是一个新的问题吗?我在上面添加了我的问题以获取更多信息。是的,过了一段时间,我的意思是它工作了1.5个月,但突然它不工作了。我看Team Foundation服务器,什么都没变。我在上下文中也找不到任何区别。正如您所看到的,代码应该是正确的。id不为null,因此savechanges有效//仅显式加载配置文件关系Context.Entry(reaction.Reference)(r=>r.Profile.Load();我将此代码放在SaveChanges()之后。你知道为什么必须这样做吗?@LockTar:这是在你没有启用延迟加载的时候。它显式加载引用/集合关系。奇怪的是你不能用懒散的方式。您正在使用WCF RIA服务吗?如果是这样,Lazyloading将被禁用,并且由于序列化问题而无法轻松启用。