2012-03-23 3 views
1

私は2つのテーブルInvoicesとCustomersを持つdbを持っています。得意先コードPKは、請求書テーブルでFKです。私は、ユーザーが請求書データを入力するCreateビューを持っています。このフォームには、@ Html.DropDownListがあり、SelectListにはdbカスタマにすでに存在する名前が設定されています。ユーザーの選択の顧客データフィールドに基づいて部分図を経由してデータベースから顧客データをautopopulatedされています。これはうまく動作しますが、私は送信ボタンを作成するとき、それは中cutomerの新しいインスタンスを作成しますMVC 3 EF - 既存のデータを使用して新しいレコードを追加する

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

データベースから取得した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をそれぞれ示す方法を作成します:部分図を作成してビューに表示されている場合には、適切な顧客IDをdisplayes

[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

関連する問題