これらの POCO クラスを考えると
class MainClass{
[Key] int id {get;set;}
public string name {get;set;}
[Required]
public virtual ICollection<SubItem> subItems {get;set} // unique sub items
}
と
Class SubItem{
[Key] int id {get; set;}
public string name {get;set;}
[Required] // required is nedded. the subitem cannot exist by it's self
public MainClass parent {get; set;}
}
それを投稿してコントローラーにバインドすると、すべてが設定され、すべてのサブアイテムの状態を次のように設定しました。
public virtual ActionResult Edit([Bind()] MainClass entity) {
foreach(var subItem in entity.subItems)
db.Entry(subItem).State = System.Data.Entity.EntityState.Modified;
if (ModelState.IsValid) { // Fails here
db.Entry(entity).State = System.Data.Entity.EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Edit", new { edited = "true" });
}
}
ただし、modelState には、各項目の「親を null にすることはできません」というエラーが含まれています。そして検証は失敗します。何らかの理由で、「親」プロパティが自動的に入力されません。どうすれば回避できますか?
このようなビューをレンダリングしています。
@model MainClass
@Html.HiddenFor(m=>m.id)
@Html.EditorFor(m=>m.name)
@Html.EditorFor(m=>m.subItems)
SubItem には次のようなものがありますEditorTemplate
@model SubItem
@Html.HiddenFor(m=>m.id)
@Html.EditorFor(m=>m.name)
[Required] parent
カスケード削除のために必要です。
[Required]
すべてがうまく機能しなければ。また、db を保存すると、parent プロパティが追加されます。ただし、カスケード削除は移行時にオフになります。