2009-03-08 4 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

예 : 다음 코드로 작성되었습니다 EF 4 개체를 업데이트합니다

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

강력한 형식의 뷰에서 MVC의 컨트롤러 매개 변수 :

트릭은 ObjectStateManager를 사용하여 상태를 변경하는 것입니다. f rom 일단 엔티티가 컨텍스트에 추가되면 Modified에 추가됩니다.

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

당신이 EF5 사용을 사용하는 경우 @Sean 밀스 당으로하는 코멘트 :

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