2009-03-08 8 views
24

Ich übertrage Daten zwischen dem Entitätsframework und der Business-Schicht und der Benutzerschicht mithilfe von Datenübertragungsobjekten. Ich habe einige Zweifel, wenn ich ein Objekt, das in ein DTO konvertiert wird, abrufen, wie aktualisiere ich das richtige Objekt im Entity-Framework und nicht nur ein Duplikat einfügen?Aktualisieren von Entitäts-Framework-Objekten

Antwort

2

Sie müssten einen primären oder alternativen Schlüssel in das DTO aufnehmen und diesen Schlüssel bei der Aktualisierung wieder mit der korrekten EF-Entität abgleichen.

7

eine alte Frage, aber nur für den Fall, dass jemand braucht eine Code-Lösung:

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

Beispiel:

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

Der folgende Code wird eine EF 4 Entität aktualisieren, die wie geschaffen wurden Ein Controller-Parameter in MVC aus einer stark typisierten Ansicht:

Es scheint der Trick besteht darin, den ObjectStateManager zu verwenden, um den Status f zu ändern rom Hinzugefügt zu Geändert, sobald die Entität zum Kontext hinzugefügt wurde.

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

Per @Sean Mills Kommentar, wenn Sie EF5 Gebrauch verwenden:

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

Endlich! Ich habe so viel Zeit mit anderen Workarounds verschwendet - das funktioniert großartig, ohne dass dbObject.Property = passedObject.Property für jede Eigenschaft beim Update ausgeführt werden muss. – kape123

+2

Wenn der ObjectStateManager keine Eigenschaft Ihres Kontexts ist 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(); 
}