2017-07-03 64 views
1

我不得不模型,說A和B妥善處理模型視圖響應MVC中的ASP.NET EF

public class A 
{ 
public int AID {get; set; } 
public string Name {get; set;} 
public virtual B B {get; set;} 
} 

public class A 
{ 
[ForeignKey("A")] 
public int BID {get; set; } 
public string Name {get; set;} 
public virtual A A {get; set;} 
} 

而且一個ViewModel

public class ABViewModel 
{ 
public A A {get;set;} 
public B B {get;set;} 
} 

然後,我希望有一個視圖,可以讓我設定兩個模型的名稱同時,所以控制器看起來像

public ActionResult Create() 
{ 
var viewModel = new ABViewModel(); 
return View(viewModel); 
} 

到目前爲止好,響應如何?類似以下內容返回錯誤

值不能爲空。參數名:實體

public ActionResult Create([Bind(Include = "A, B")] ABViewModel stuff) 
    { 
     if (ModelState.IsValid) 
     { 
      db.A.Add(stuff.A); // <-- here occurs the error 
      stuff.B.A = stuff.A; 
      db.B.Add(stuff.B); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(stuff); 
    } 
+1

'「...返回一個錯誤」' - – David

+1

你需要包括你得到的例外。 – ngeksyo

+1

更新了問題 – rst

回答

2

你不需要的ViewModels這個時候。

您的A包含BB包含A。首先是

。選擇其中的一個,讓我挑A

public ActionResult Create() { 
    var model = new A(); 
    model.B = new B(); 
    return View(model); 
} 

,那麼你的「視圖」的一個內容和AB的內容修改

public ActionResult Create([Bind] A stuff) 
{ 
    if (ModelState.IsValid) 
    { 
     db.A.Add(A); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    return View(stuff); 
} 

一次A包含B,也沒有必要Add(添加) B的ModelState也將被設置爲ModelState.Added

回答你的問題。在該行:db.A.Add(stuff.A);A不包含B實例初始化。 A.B爲空。這就是你遇到錯誤的原因。

您必須首先將B添加到A,然後保存數據庫。如果你真的想創建一個ViewModel,請執行下面的問題:

stuff.A.B = stuff.B; 
db.A.Add(stuff.A); // <-- Here is all good cause now A contains B. 
stuff.B.A = stuff.A; // there is no need for it anymore 
db.B.Add(stuff.B); // no need, B was already added on A.Add(...) 
db.SaveChanges(); 
+1

好的,那個工作非常感謝你。但是,如何在問題中使用ViewModel進行設置?我猶豫接受這個答案。 – rst

+0

我編輯了我的答案,以正確回答你的問題 –

+0

不幸的是我現在不能測試這個,但我不認爲這有效....我得到的錯誤是'db.A'行的'null'。添加(stuff.A)'因爲'stuff.A'爲空....你的答案如何解決,我沒有看到。 – rst