簡體   English   中英

如何更新實體框架中的相關實體

[英]How to update related entities in Entity Framework

我有一個MVC項目,並為數據庫使用Entity Framework Code First和POCO對象。 例如:

public class ClassA
{
  public int? Id {get; set;}
  public string Name { get; set;}
  public virtual ClassB B {get; set;}
}

public class ClassB
{
  public int? Id {get;set;}
  public string Description {get;set;}
}

我有一個ActionResult,可以創建或編輯模型。 問題是,當我調用此ActionResult來更新模型,並且model.B已更改時,關系不會保存在數據庫中。 當調用ActionResult來創建一個新對象時,它按預期工作。 我該如何解決這個問題?

public ActionResult Save(ClassA model)
{
  model.B = GetBFromDb(model.B.Id.Value);

  if(ModelState.IsValid)
  {
    if (id.HasValue)
    {
      context.Entry(model).State = System.Data.EntityState.Modified;
    }
    else
    {
      context.ClassAs.Add(model);
    }
    context.SaveChanges();
    // redirect to index etc.
  }
  return View("EditForm", model);
}

我通過使用外鍵將ClassA更改為ClassB並設置BId的值來解決它:

public class ClassA
{
  public int? Id {get; set;}
  public string Name { get; set;}
  public int BId {get;set;} // foreign key to B
  public virtual ClassB B {get; set;}
}

為什么這個外鍵屬性能夠完成工作而不是EF生成的外部ky?

你不能簡單地打電話:

context.Entry(model).State = System.Data.EntityState.Modified;

必須首先從上下文中檢索實體,以便EF可以開始跟蹤它。 然后,您需要在調用context.SaveChanges()之前對該實體應用任何更改。

var entity = context.ClassAs.Find(model.Id);

// set properties you want to modify on entity
entity.Name = model.Name;
entity.ClassB = context.ClassBs.Find(model.ClassB.Id);
// other changes to entity as required...

context.SaveChanges();

這樣,EF就是跟蹤entity並且知道對它應用更新。

如果您附加然后將狀態設置為已修改的實體框架將發送所有屬性以進行更新。 您不必采用下面的水獺方法,因為這會導致整個單獨的負載發生。 如果你這樣做,那么在傳遞一個模型,只有一個id然后你調用TryUpdateModel來填充表單中的屬性是沒有意義的。

個人這里修改的附件有點清潔,因為它不需要完整的往返,因為加載數據

http://geekswithblogs.net/michelotti/archive/2009/11/27/attaching-modified-entities-in-ef-4.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM