2009-03-08 19 views
24

Przesyłam dane między strukturą encji a warstwą biznesową i warstwą użytkownika za pomocą obiektów przenoszenia danych. Mam pewne wątpliwości, jeśli pobierze obiekt, który jest konwertowany do DTO, jak zaktualizować poprawny obiekt w strukturze podmiotu, a nie tylko wstawić duplikat?Zaktualizuj obiekty struktury encji

Odpowiedz

2

Musisz wprowadzić klucz podstawowy lub zapasowy w DTO, a następnie dopasować ten klucz z powrotem do właściwej jednostki EF po aktualizacji.

7

stare pytanie, ale tylko w przypadku gdy ktoś potrzebuje rozwiązania code:

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

Przykład:

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

Poniższy kod będzie zaktualizować EF 4 podmiot, który został utworzony jako parametr kontrolera w MVC z mocno wpisanego widoku:

Wydaje się, że wystarczy użyć ObjectStateManagera, aby zmienić stan rom Dodano do Zmodyfikowanej, gdy jednostka została dodana do kontekstu.

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

Zgodnie @Sean Mills komentować jeśli używasz korzystanie EF5:

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

Wreszcie! Zmarnowałem tyle czasu z innymi obejściami - działa to bez potrzeby dbObject.Property = passedObject.Property dla każdej właściwości podczas aktualizacji. – kape123

+2

, jeśli obiekt ObjectStateManager nie jest właściwością kontekstu, należy wypróbować ((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(); 
} 
Powiązane problemy