24

データ転送オブジェクトを使用して、エンティティ フレームワークとビジネス レイヤーおよびユーザー レイヤーの間でデータを転送します。DTO に変換されたオブジェクトを取得する場合、重複を挿入するだけでなく、エンティティ フレームワークで正しいオブジェクトを更新するにはどうすればよいのでしょうか。

4

5 に答える 5

28

次のコードは、MVCでコントローラーパラメーターとして作成されたEF 4エンティティを、強く型付けされたビューから更新します。

エンティティがコンテキストに追加されたら、ObjectStateManagerを使用して状態を追加から変更に変更するのがコツのようです。

MyEntities db = new MyEntities();
db.Product.AddObject(product);
db.ObjectStateManager.ChangeObjectState(product, System.Data.EntityState.Modified);
return db.SaveChanges() > 0;

@Sean Millsのコメントによると、EF5を使用している場合は、次を使用してください。

 ((IObjectContextAdapter) db).ObjectContext.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Added);
于 2010-11-18T07:36:52.697 に答える
7

古い質問ですが、誰かがコードソリューションを必要とする場合に備えて:

http://www.mikesdotnetting.com/Article/110/ASP.NET-MVC-Entity-Framework-Modifying-One-to-Many-and-Many-to-Many-Relationships

例:

public void EditArticle(
        Article article, string articleTypeId, string[] categoryId) 
{ 
  var id = 0; 
  Article art = de.ArticleSet 
                  .Include("ArticleTypes")
                  .Include("Categories")
                  .Where(a => a.ArticleID == article.ArticleID)
                  .First();

  var count = art.Categories.Count;
  for (var i = 0; i < count; i++)
  {
    art.Categories.Remove(art.Categories.ElementAt(i));
    count--;
  }
  foreach (var c in categoryId)
  {
    id = int.Parse(c);
    Category category = de.CategorySet
        .Where(ct => ct.CategoryID == id).First();
    art.Categories.Add(category);
  }

  art.Headline = article.Headline;
  art.Abstract = article.Abstract;
  art.Maintext = article.Maintext;
  art.DateAmended = DateTime.Now;

  art.ArticleTypesReference.EntityKey = new EntityKey(
                                          "DotnettingEntities.ArticleTypeSet", 
                                          "ArticleTypeID", 
                                          int.Parse(articleTypeId)
                                          );

  de.SaveChanges();
}
于 2010-06-28T04:34:03.057 に答える
4
//I am replacing player :)
public ActionResult ProductEdit(string Id, Product product)
{
    int IdInt = DecyrptParameter(Id);
    MyEntities db = new MyEntities();

    var productToDetach = db.Products.FirstOrDefault(p=> p.Id == IdInt);
    if (product == null)
        throw new Exception("Product already deleted"); //I check if exists, maybe additional check if authorised to edit
    db.Detach(productToDetach);

    db.AttachTo("Products", product);
    db.ObjectStateManager.ChangeObjectState(product, System.Data.EntityState.Modified);

    db.SaveChanges();
    ViewData["Result"] = 1; // successful result
    return View();
}
于 2011-05-22T19:09:07.713 に答える
2

これは EF 5 で機能するはずです: https://stackoverflow.com/a/11749716/540802 :

db.Entry(product).State = EntityState.Modified;
于 2013-05-21T14:18:01.247 に答える
2

DTO に主キーまたは代替キーを含め、更新時にそのキーを正しい EF エンティティに戻す必要があります。

于 2009-03-08T15:25:50.603 に答える