2011-01-23 8 views
2

Stack OverflowとGoogleを検索しているときに私の状況に明確な答えが見つからない場合は、誰かが私を正しい方向に向けることができれば幸いです。MVCとEF4 CTPモデルバインディングと階層モデルの保存

私はASP.NET MVC 3とEntity Frameworkの4 CTPを使用して3レベルの深さの階層的なエンティティを更新するために、(単一ビューで)、単一の編集フォームを使用できるようにしたい 私の状況(コード - 最初に) - このモデルはサービスで構成され、多くのサービスオプションを持つことができ、ターンでは多くのインベントリアイテムを持つことができます。

  1. アップデート既存の「サービス」レコード
  2. 追加/更新/削除「サービスオプション」記録(添付: 私はに(TryUpdateModel経由)MVCSのデフォルトのモデルバインダーを使用できるように期待していた

    投稿の値に応じて)各サービスオプションに添付(掲示値
  3. 追加/更新/削除「インベントリ」の記録に応じて)サービスへ

M yのモデル

[Bind(Include="Name, ServiceOptions")] 
public class Service { 
    [Key] 
    public int ServiceID { get; set; }  
    public string Name { get; set; }   
    public DateTime DateCreated { get; set; } 
    public virtual ICollection<ServiceOption> ServiceOptions { get; set; } 
} 

[Bind(Include="ServiceOptionID, Description, Tags")] 
public class ServiceOption { 
    [Key] 
    public int ServiceOptionID { get; set; } 
    public int ServiceID { get; set; } /* parent id reference */ 
    public string Description { get; set; } 
    public virtual ICollection<Inventory> InventoryItems { get; set; } 
} 


[Bind(Include = "InventoryID, Description")] 
public class Inventory { 
    [Key] 
    public int InventoryID { get; set; } 
    public int ServiceOptionID { get; set; } /* parent id reference */ 
    public string Description { get; set; } 
} 

理想コントローラ方法:

[HttpPost] 
public ActionResult EditService(int id) { 
    Service service = db.Services.Single(s => s.ServiceID == id); 
    TryUpdateModel(service); // automatically updates child and grandchild records 

    if (ModelState.IsValid) {    
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(service); 
} 

は、このユートピアの夢を達成するための方法はありますか、私は間違ってツリーを吠えていますか?私は別の技術(通常のEF4、Automapperなど)を使用することに開放しています

ありがとうございます!

答えて

0

デフォルトのモデルバインダーだけでは?おそらくそうではありません。

カスタムでは?多分。

ただし、問題はモデルバインダー自体ではありません。あなたの問題は、EFとORM(一般的には)コレクションからアイテムを削除操作として削除することは考慮していないと思います。実際にORMに何を伝えているのかは、関係が存在しないことです。子行を削除する必要はありません。あなたのマッピングによっては、通常、 "参照整合性制約違反が発生しました"のようなエラーが発生します。これはコードのためにはまずありません。これはEFの仕組みです。

EFはこのように設計されており、他のm2m関係を参照するm2m関係がある場合など、より複雑な関係には本当に重要です。あなたは本当に、EFが関係を取り除くための呼び出しを明確にし、行を完全に削除するようにしたいと思っています。

また、IMHOでは、http値のマッピングを担当するコード部分にもオブジェクトの永続化方法が指示されるため、この手法も悪いことです。これは悪い動きです。私は削除操作をかなり嫌な行為とみなし、ModelBinderだけに残すべきではありません。ソフト削除やロギングを行わないと、オブジェクトを削除することは「深刻なビジネス」とみなされます。

+0

ありがとうございました。エンティティ、その子ども、孫に更新をとった単一のフォームを投稿する必要がある場合は、どうしたらいいですか? DTOで?保存する前にDTOの内容を反映するように手動でエンティティグラフを更新しますか? – Brendan

関連する問題