2012-03-23 42 views
1

我有一個帶兩張表的發票和客戶。客戶PK在發票表中是FK。我有一個創建視圖,用戶在其中填寫發票數據。在這個表單中,我有一個帶有SelectList的@ Html.DropDownList,其中填充了db客戶中已經存在的名稱。用戶選擇客戶數據字段的基礎是autopopulated客戶數據經由局部視圖數據庫:MVC 3 EF - 使用現有數據添加新記錄

@using (Ajax.BeginForm("CustomerSelect", "Invoice", new AjaxOptions{ 
      HttpMethod = "GET", 
      InsertionMode = InsertionMode.Replace, 
      UpdateTargetId = "CustomerFields"})) 

這工作得很好,但是當我創建提交按鈕,它會在該CUTOMER的新實例數據庫,即使它應該使用從數據庫檢索到的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> 

但是,當我看發票對象內部中的Controler的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); 
} 

我在做什麼錯?

回答

3

Add方法增加了實體圖中的所有實體。因此,如果您的發票實例具有Customer屬性集,並且您打電話添加,它將爲客戶和發票創建新記錄。

如果你想只添加發票您有幾種選擇:

  • 揭露發票CustomerID,不與導航性能運行。這將爲您提供foreign key association,這在這種情況下更容易使用。
  • 將客戶實例的狀態更改回原來的狀態,以便只將發票和客戶之間的發票和關係視爲已添加。

例子:

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

這兩種方式對我的工作太好了,謝謝了很多! – Eric 2012-03-23 13:06:10