2017-06-12 15 views
2

データベース内のApplicantApplicantNotification OneToOneリレーションシップテーブルを更新しようとしています。しかし、私が努力しているのは働いていない。EF Updateデータベース内の2つのエンティティが更新されていません

オブジェクトをEFで選択してプロパティを上書きするので、EFは変更を追跡しますが、データベースには反映されません。

質問: EFで2つのエンティティを更新するにはどうすればよいですか?

申請者:

[Index] 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int ApplicantID { get; set; } 
    [Required] 
    public string ApplicantTitle { get; set; } 
    [Required] 
    public string Firstname { get; set; } 
    [Required] 
    public string Lastname { get; set; } 
    [Required] 
    public string Address { get; set; } 
    [Required] 
    public string Address1 { get; set; } 
    [Required] 
    public string Address2 { get; set; } 
    [Required] 
    public string Address3 { get; set; } 
    [Required] 
    public string Postcode { get; set; } 
    [Required] 
    public string CaseReference { get; set; } 
    [DataType(DataType.Date)] 
    public DateTime DateOfBirth { get; set; } 
    public ApplicantNotification Notification { get; set; } 

ApplicantNotification:

[Index] 
     [Key, Column("ApplicantID"), ForeignKey("Applicant")] 
     public int ApplicantNotificationID { get; set; } 
     public bool FirstNotification { get; set; } 
     public bool SecondtNotification { get; set; } 
     public bool ThirdNotification { get; set; } 
     public bool FinalNotification { get; set; } 
     [DataType(DataType.Date)] 
     public DateTime? ReminderDate { get; set; } 
     public int ReminderFrequency { get; set; } 
     [DataType(DataType.Date)] 
     public DateTime? FirstNotificationDate { get; set; } 
     [DataType(DataType.Date)] 
     public DateTime? SecondNotificationDate { get; set; } 
     [DataType(DataType.Date)] 
     public DateTime? ThirdNotificationDate { get; set; } 
     public bool IsArchive { get; set; } 
     public virtual Applicant Applicant { get; set; } 

方法:あなたがdbContextsか何かを横断しようとすることになり

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Edit(ApplicantNotificationViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     //select from ef 
     var applicant = (from a in db.Applicants 
         where a.ApplicantID == model.ApplicantID 
         select a).FirstOrDefault(); 

     var applicantNotification = (from an in db.ApplicantNotifcations 
            where an.ApplicantNotificationID == model.ApplicantID 
            select an).FirstOrDefault(); 

     SetApplicant(model, applicant); 
     SetApplicantNotification(model, applicantNotification); 

     using (var context = new WorkSmartContext()) 
     { 
       try 
       { 
        db.Entry(applicant).State = EntityState.Modified; 

        db.Entry(applicantNotification).State = EntityState.Modified; 
        context.SaveChanges(); 

       } 
       catch (Exception ex) 
       { 

       } 

     } 
     return RedirectToAction("Index"); 
    } 
    return View(model); 
} 

おかげ

+0

私はそれも試してみましたが、更新しませんテーブル – Haris

+1

なぜこのシナリオでの取引ですか? EFはすでにそれを1つにまとめます。 [here](https://msdn.microsoft.com/en-us/library/dn456843(v=113).aspx) –

+0

を参照してください。これは2つのエンティティを更新するためですか? 2番目のSaveChanges()で例外がスローされると仮定します。また、これら2つのテーブルの間にOneToOne関係があります。 – Haris

答えて

0

、ウィット

var applicant = db.Applicants 
    .Include(a=>a.Notification) 
    .FirstOrDefault(a=>a.ApplicantId = model.ApplicantId); 

if (applicant == null) 
    // Handle missing Applicant scenario here. 

SetApplicant(model, applicant); 
SetNotification(model, applicant.Notification); 

db.SaveChanges(); 

あなたの申請者は、関連通知への参照を持っています。それはつなぎ合わせるのは難しいですが、あなたはおそらくしたいことより、このようなものです。このWorkSmartContextの定義を見てハウトこれを使って。関連する個々のエンティティを読み込む必要はありません。関係のないエンティティを更新する必要があるが、すべてが成功または失敗することを確認する必要がある場合は、トランザクションまたは作業単位パターンを使用します。 (私はこのWorkSmartContextを推測していると思いますが、 "db"から派生していないか、または縛られていません)。

+0

素晴らしい、これを行うためにナビゲーションプロパティを使用する方法が不思議だった – Haris

関連する問題