我有一个带有两个表发票和客户的数据库。客户PK在发票表中是FK。我有一个用户填写发票数据的创建视图。在这个表单上,我有一个@Html.DropDownList,其中SelectList填充了db客户中已存在的名称。在用户选择的基础上,客户数据字段通过部分视图自动填充来自数据库的客户数据:
@using (Ajax.BeginForm("CustomerSelect", "Invoice", new AjaxOptions{
HttpMethod = "GET",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "CustomerFields"}))
这很好用,但是当我创建Submit按钮时,它会在数据库中创建一个cutomer的新实例,即使它应该使用从db中检索到的id的id。当部分视图显示在“创建”视图上时,它将显示正确的客户ID:
<div class="editor-label">
@Html.LabelFor(model => model.Customer)
<div class="editor-field">
@Html.EditorFor(model => model.Customer)
@Html.ValidationMessageFor(model => model.Customer)
</div>
</div>
但是当我查看控制器创建方法的httppost中的发票对象时,它会显示一个不同的(新)客户ID:
[HttpPost]
public ActionResult Create(Invoice invoice)
{
if (ModelState.IsValid)
{
db.Invoices.Add(invoice); **//invoice.Customer.CustomerID == 1**
db.SaveChanges(); **//invoice.Customer.CustomerID changes to next free in the db == 7**
return RedirectToAction("Index");
}
return View(invoice);
}
我做错了什么?
答案 0 :(得分:3)
Add
方法添加实体图中的所有实体。因此,如果您的发票实例设置了Customer
属性,并且您调用了Add,则会为客户和发票创建新记录。
如果您只想添加发票,则几乎没有选项:
CustomerID
,不使用导航属性。这将为您提供foreign key association,这在这种情况下更容易使用。示例:
db.Invoices.Add(invoice);
db.Entry(invoice.Customer).State = EntityState.Unchanged;
db.SaveChanges();