2009-03-08 6 views
24

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

答えて

2

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

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(); 
} 
28

次のコードのように作成されているEF 4エンティティを更新しますMVCの強力な型付けされたビューからのコントローラパラメータ:

これは、ObjectStateManagerを使用して状態f romエンティティがコンテキストに追加されると、Modifiedに追加されました。 @Seanミルズコメントを1として

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

あなたはEF5の使用を使用している場合:

((IObjectContextAdapter) db).ObjectContext.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Added); 
+0

!私は他の回避策で多くの時間を無駄にしました。これは更新するときにdbObject.Property = passedObject.Propertyをすべてのプロパティに対して実行する必要がなくてすごく効果的です。 – kape123

+2

ObjectStateManagerがコンテキストのプロパティでない場合try((System.Data.Entity.Infrastructure.IObjectContextAdapter)db).ObjectContext http://stackoverflow.com/a/8968643/678338 –

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(); 
} 
関連する問題