我需要模型,比如A和B
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;}
}
然后我想要一个View,它允许我同时设置两个模型的名称,所以控制器看起来像
public ActionResult Create()
{
var viewModel = new ABViewModel();
return View(viewModel);
}
到目前为止,反应如何?类似下面的内容会返回错误
值不能为空。参数名称:entity
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);
}
答案 0 :(得分:2)
这次你不需要ViewModels。
您的A
包含B
和B
包含A
。
第一。选择其中一个,让我选择A
public ActionResult Create() {
var model = new A();
model.B = new B();
return View(model);
}
然后你修改&#34;视图&#34; A内容和A.B内容
public ActionResult Create([Bind] A stuff)
{
if (ModelState.IsValid)
{
db.A.Add(A);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(stuff);
}
一旦A包含B,就不需要添加B.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();