MVC 3 EF - 使用现有数据添加新记录

时间:2012-03-23 09:46:04

标签: asp.net-mvc entity-framework

我有一个带有两个表发票和客户的数据库。客户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);
}

我做错了什么?

1 个答案:

答案 0 :(得分:3)

Add方法添加实体图中的所有实体。因此,如果您的发票实例设置了Customer属性,并且您调用了Add,则会为客户和发票创建新记录。

如果您只想添加发票,则几乎没有选项:

  • 在发票上公开CustomerID,不使用导航属性。这将为您提供foreign key association,这在这种情况下更容易使用。
  • 将客户实例的状态更改回未更改状态,以便仅将发票和客户之间的发票和关系视为已添加。

示例:

db.Invoices.Add(invoice); 
db.Entry(invoice.Customer).State = EntityState.Unchanged;
db.SaveChanges();