首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >EF:将实体复杂字段设置为空

EF:将实体复杂字段设置为空
EN

Stack Overflow用户
提问于 2012-03-16 12:45:23
回答 1查看 354关注 0票数 0

实体:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Page
{
    //...
    public virtual Page Parent { get; set; }
}

需要将父字段设置为空。我试过了,但没有成功:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Existing entity
Page pageAttached = db.Pages.First(x => x.Id == page.Id);
db.Entry(pageAttached).CurrentValues.SetValues(page);
if (model.ParentId != null)
    pageAttached.Parent = db.Pages.First(x => x.Id == model.ParentId);
else
    pageAttached.Parent = null;    //does nothing
db.SaveChanges();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-16 19:26:10

Parent不是一个“复杂字段”,它是一个“导航属性”。

如果你这样做了,它会起作用吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Existing entity
Page pageAttached = db.Pages.Include(x => x.Parent).First(x => x.Id == page.Id);
db.Entry(pageAttached).CurrentValues.SetValues(page);
if (model.ParentId != null)
    pageAttached.Parent = db.Pages.First(x => x.Id == model.ParentId);
else
    pageAttached.Parent = null;    //does nothing
db.SaveChanges();

对注释1的响应

不,我是说.Include(x => x.Parent)。我更喜欢使用lambda重载的强类型。将魔术字符串排除在代码之外。

这样做的原因是因为DbContext使用动态生成的代理类来进行延迟加载。当您只查询.First(x => x.Id == page.Id)时,返回的对象实际上是一个将Page实体实现为其基类的类。(这就是集合和导航属性必须标记为virtual的原因,以便可以在动态代理中覆盖它们。)此外,即使在db中存在父引用,动态生成的代理也具有空的父引用。

直到调用parent属性get方法,EF才会命中db来延迟加载父对象。这是当它发现数据库实际上是否具有null或非null的Parent属性时。因此,当您在父级实际延迟加载之前设置.Parent = null时,EF不会执行任何操作,因为它已经是空的。

我建议的代码使用.Include来加载属性。这意味着db在单个db调用中获得子代和其父元素。现在,当您设置为null时,DbContext将在您的下一次SaveChanges期间跟踪更改并删除该关系。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9737483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文