2017-09-30 10 views
0

私はEntity Frameworkのヘルプが必要です。Entity Frameworkで新しいアイテムを追加した後にIDを取得

コントローラー:

public ActionResult Create([Bind(Prefix = "visit")] visit visit, [Bind(Prefix = "drugsEdition")] IEnumerable<drugsEdition> drugsEdition, [Bind(Prefix = "accessoryEdition")] IEnumerable<accessoryEdition> accessoryEdition, [Bind(Prefix = "servicesEdition")] IEnumerable<servicesEdition> servicesEdition) 
{ 
    Models.VisitDetails visitDetails = new Models.VisitDetails(); 
    visitDetails.visit = visit; 

    if (ModelState.IsValid) 
    { 
     db.visit.Add(visit); 

     if (drugsEdition != null) 
     { 
      foreach (var item in drugsEdition) 
      { 
       item.idVisit = visit.id; 
       db.drugsEdition.Add(item); 
      } 
     } 

     if (accessoryEdition != null) 
     { 
      foreach (var item in accessoryEdition) 
      { 
       item.idVisit = visit.id; 
       db.accessoryEdition.Add(item); 
      } 
     } 

     if (servicesEdition != null) 
     { 
      foreach (var item in servicesEdition) 
      { 
       item.idVisit = visit.id; 
       db.servicesEdition.Add(item); 
      } 
     } 

     db.SaveChanges(); 

     return RedirectToAction("Details", new { id = visit.id }); 
    } 

    return View(visitDetails); 
} 

モデル:このコードで

[Table("servicesEdition")] 
public partial class servicesEdition 
{ 
    public int id { get; set; } 

    public int idService { get; set; } 
    public int idVisit { get; set; } 
    public double priceSell { get; set; } 

    [ForeignKey("idService")] 
    public virtual services services { get; set; } 
} 

が、私は、データベースへの新しい訪問を追加し、私は訪問者の idコード行 db.visit.Add (visit)後に取得します。新しい drugsEditionと新しいを追加すると、このコードは正しく入力され、 idVisitが追加されましたが、 servicesEditionのidVisit = 0が追加されました。なぜ 'servicesEdition'が良いidVisitを取得しないのですか?

+0

'ServicesEdition'クラスの定義はどのようになっていますか? – Shyju

答えて

0

あなたがタイプVisitvirtualナビゲーションプロパティを追加した場合、EFは、対応する訪問IDを取得し、それはあなたのSaveChangesメソッド呼び出しにservicesEditionオブジェクトを保存したときのことを記入します。

外部キーのプロパティの名前をVisitIdに変更すると、参照整合性が規約(命名規則)によって機能し、明示的にForeignKey属性を使用する必要はありません。また、私は上記のようにあなたがServicesEditionエンティティ定義を変更したくない場合は、別のオプションを呼び出すことです

public partial class ServicesEdition 
{ 
    public int id { get; set; } 

    public int idService { get; set; } 

    public int VisitId { get; set; } 

    public virtual Visit Visit { get; set; } 

    public double priceSell { get; set; } 

    [ForeignKey("idService")] 
    public virtual services services { get; set; } 
} 

(あなたのコードが動作するために必ずしも必要ではない)C#クラスを書くときPascalCasingを使用するためにあなたをお勧めしますVisitエンティティを追加した後で、そのIDプロパティにアクセスすることができます。 SaveChanges()メソッド。 db.SaveChanges();

を打つまで

db.visit.Add(visit); 
db.SaveChanges(); 

var visitId = db.Id; 
//Now you can use visitId to save other entities 
+0

ありがとう、実際に私は別のクラス 'accessoryEdition'と 'drugsEdition'で仮想訪問していますが、エンティティ間の接続があるかどうかはわかりませんでした。 –

0

問題は、あなたがdb.visit.Add(visit);db.SaveChanges();を追加することができ、IDを生成しませんdb.visit.Add(visit);です。 または、Shyjuが説明したようにグラフとして保存します。

関連する問題