2 Stimmen

Problem mit SaveChanges() Entity Framework 4.1

Ich habe ein Problem mit dem Speichern der Änderungen in der Datenbank.

Ich aktualisiere das Modell A in meinem Controller, aber wenn ich die Änderungen mit SaveChanges() speichern, habe ich am Ende ein dupliziertes Element in der Datenbank für B.

Nach dem Aufruf von UpdateModel() habe ich die Bs-Eigenschaft überprüft, und es war so, wie ich es erwartet hatte, aber direkt nach dem Aufruf von SaveChanges(), wenn ich die Bs-Eigenschaft untersuche, sehe ich, dass die Id völlig anders ist (neue Id und neuer Eintrag).

Meine Klasse ist ähnlich wie diese:

public class A
{
    [HiddenInput(DisplayValue = false)]
    public int AId { get; set; }

    public string Name { get; set; }

    public virtual ICollection<B> Bs{ get; set; }
}

public class B
{
    [HiddenInput(DisplayValue = false)]
    public int BId { get; set; }

    public string Name { get; set; }

    public virtual ICollection<A> As{ get; set; }
}

Mein Controller ist folgendermaßen aufgebaut:

    [HttpPost]
    public ActionResult Edit(A theA)
    {
        try
        {
           db.Entry(theA).State = EntityState.Modified;

           foreach (var item in theA.Bs)
           {
               db.Entry(item).State = EntityState.Modified;
           }

           db.SaveChanges();

           return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }

Mache ich etwas falsch?

Vielen Dank im Voraus

8voto

Ladislav Mrnka Punkte 355028

Das ist ein übliches Verhalten. Das Problem ist, dass EF nicht weiß, dass Sie eine bestehende B so dass automatisch ein neuer Datensatz eingefügt wird. Sie müssen EF sagen, dass die B ist eine bestehende durch Aufruf:

// here add B to the collection in the A and after that call:
dbContext.Entry<B>(someB).State = EntityState.Unchanged();

oder durch Anbringen von B bevor Sie es der Sammlung in A (Ich bin nicht sicher, ob dies möglich ist, wenn Sie UpdateModel in ASP.NET MVC).

dbContext.Bs.Attach(someB);
// now add B to the collection in the A

Eine andere Möglichkeit ist das Laden B aus der Datenbank und fügen Sie das geladene Objekt der Sammlung in A aber es ist ein zusätzlicher Hin- und Rückweg zur Datenbank.

int id = someB.Id;
var loadedB = dbCotnext.Bs.Single(b => b.Id == id);
someA.Bs.Add(loadedB);
dbContext.As.Add(someA);
dbContext.SaveChanges();

Schlussfolgerung: Jedes Mal, wenn Sie anrufen Add der gesamte Objektgraph wird als eingefügt verfolgt, es sei denn, Sie fügen zuerst verwandte Objekte hinzu (bevor Sie sie zum eingefügten übergeordneten Objekt hinzufügen - 2. und 3. Beispiel) oder Sie ändern den Status der verwandten Objekte manuell auf unverändert zurück, nachdem Sie das übergeordnete Objekt hinzugefügt haben. (das 1. Beispiel).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X