【问题标题】:SetModifiedProperty for nested properties嵌套属性的 SetModifiedProperty
【发布时间】:2012-02-20 19:17:33
【问题描述】:

如何为嵌套属性设置 SetModifiedProperty?换句话说,我有一个实体作者,他的实体有一个书籍集合,我只需要更改一个书名。

    var existingAuthor = authors.FirstOrDefault(x => x.Id.Equals(authorId));
    var bestSellerBook = existingAuthor.Books.FirstOrDefault(x=> x.Id.Equals(bookId));
    existingAuthor.Name = "xxxxxxx";
    bestSellerBook.Name = "xxxxxxxxxxx";
    context.Authors.Attach(existingAuthor);  
    context.ObjectStateManager.GetObjectStateEntry(existingAuthor).SetModifiedProperty("Name");
    context.SaveChanges();

有什么建议吗?

【问题讨论】:

  • 您似乎正在修改一本书,那么为什么不像您对作者所做的那样将这本书标记为已修改呢?我误解你的问题了吗?

标签: entity-framework entity-framework-4.1 poco


【解决方案1】:

您必须为持有已更改属性的实体获取对象状态条目 = 在您的情况下,它必须是书:

var existingAuthor = authors.FirstOrDefault(x => x.Id.Equals(authorId));
var bestSellerBook = existingAuthor.Books.FirstOrDefault(x=> x.Id.Equals(bookId));
bestSellerBook.Name = "xxxxxxxxxxx";
context.Authors.Attach(existingAuthor);  
context.ObjectStateManager.GetObjectStateEntry(bestSellerBook).SetModifiedProperty("Name");
context.SaveChanges();

【讨论】:

  • 问题是我同时修改了 2 个实体(作者和书籍)。
  • @JAPT88 所以?您知道如何将作者标记为已修改,并且您知道如何将图书标记为已修改。要将两者都标记为已修改,请先标记一个,然后再标记另一个。
  • 正如@hvd 所描述的那样 - 如果您正在修改多个实体或属性(按属性粒度),您必须为每个实体或属性设置状态。
  • 感谢您的回复...是的,我知道,但问题是:如果我将这两个实体标记为已修改,更新语句将生成包含每个字段的更新,我不需要,我只需要修改请求的。
  • @LadislavMrnka 问题是我加载了一个复杂的对象图,并且只有一个子属性被修改。到目前为止,我一直在这样做,按照您所说的设置状态,为对象图中的所有属性生成更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多