2017-07-03 61 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