Ein Objekt mit demselben Schlüssel ist bereits vorhanden in der ObjectStateManager. Der ObjectStateManager nicht verfolgen können, mehrere Objekte mit dem gleichen Schlüssel
Mit EF5 mit ein generic Repository Pattern und ninject für die Abhängigkeit injenction und läuft in ein Problem, wenn Sie versuchen, das update einer entity auf die Datenbank unter Verwendung von gespeicherten Prozeduren mit meiner edmx.
mein update in DbContextRepository.cs:
public override void Update(T entity)
{
if (entity == null)
throw new ArgumentException("Cannot add a null entity.");
var entry = _context.Entry<T>(entity);
if (entry.State == EntityState.Detached)
{
_context.Set<T>().Attach(entity);
entry.State = EntityState.Modified;
}
}
Aus meiner AddressService.cs, das geht zurück zu meinem repository habe ich:
public int Save(vw_address address)
{
if (address.address_pk == 0)
{
_repo.Insert(address);
}
else
{
_repo.Update(address);
}
_repo.SaveChanges();
return address.address_pk;
}
Wenn es Sie trifft, das Anhängen und EntityState.Verändert es kotzt mit der Fehlermeldung:
Ein Objekt mit demselben Schlüssel ist bereits vorhanden in der ObjectStateManager. Der ObjectStateManager nicht verfolgen können, mehrere Objekte mit dem gleichen Schlüssel.
Habe ich mich durch viele der Vorschläge im stack und im Internet und kommen nicht mit etwas, behebt es. Jede Arbeit, Tips und Tricks wären sehr willkommen.
Dank!
InformationsquelleAutor der Frage Juan | 2012-09-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bearbeiten: Original-Antwort verwendet
Find
stattLocal.SingleOrDefault
. Es funktionierte in Kombination mit @JuanSave
Methode, aber es könnte zu unnötigen Abfragen an die Datenbank undelse
Teil war wohl nie ausgeführt wird (ausführen der else-Teil würde dazu führen, Ausnahme, da Finden schon die Datenbank abgefragt, und hatte nicht gefunden, die Person, so dass es nicht aktualisiert werden konnte). Dank @BenSwayne für die Suche nach dem Problem.Müssen Sie prüfen, ob ein Element mit demselben Schlüssel ist bereits verfolgt, durch den Kontext und ändern Sie die Einheit anstelle von anfügen des aktuellen:
Wie Sie sehen können, das Hauptproblem ist, dass
SingleOrDefault
Methode kennen muss, um den Schlüssel zu finden, der der Entität. Sie können erstellen einfache Schnittstelle freilegen der Schlüssel (IEntity
in meinem Beispiel) und implementieren Sie es in alle Ihre Objekte, die Sie Bearbeiten möchten, auf diese Weise.InformationsquelleAutor der Antwort Ladislav Mrnka
Wollte ich nicht belasten meine automatisch generierte EF-Klassen durch interfaces hinzufügen oder Attribute. so ist das wirklich ein bisschen aus einige der oben genannten Antworten (also credit geht an Mrnka Ladislav). Dies bot eine einfache Lösung für mich.
Habe ich ein func, um die update-Methode festgestellt, dass die ganzzahligen Schlüssel der Entität.
Dann, wenn Sie rufen Sie Ihren code, den Sie verwenden können..
InformationsquelleAutor der Antwort Geoff Wells
Können Sie tatsächlich abrufen der Id durch Reflexion, siehe Beispiel unten:
InformationsquelleAutor der Antwort Toffee
@serj-sagan Sie sollten es tun auf diese Weise:
**Beachten Sie, dass YourDb sollte eine Klasse, die von DbContext.
}
InformationsquelleAutor der Antwort Toffee
Andere Lösung (basierend auf @Sergej ' s Antwort) könnte sein:
Und dann würde es so nennen:
InformationsquelleAutor der Antwort Andrés S.
Ohne Reflexion, und wenn Sie nicht wollen, um die Verwendung von Schnittstellen können Sie mithilfe der funktionellen Delegierten zu finden, die eine Entität in der Datenbank.
Hier ist die aktualisierte Probe von oben.
Würden Sie es so nennen:
InformationsquelleAutor der Antwort Sergey
Wenn Sie Ihren Kontext zu AsNoTracking() dies wird stop-aspmvc die Verfolgung der änderungen an der Entität im Speicher (das ist, was Sie wollen, sowieso auf dem web).
Ich würde Ihnen empfehlen, Lesen Sie mehr dazu auf http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/advanced-entity-framework-scenarios-for-an-mvc-web-application
InformationsquelleAutor der Antwort Yashvit
Abnehmen der Einheit gefunden (siehe
attachedEntity
im Ladislav ist Lösung) und re-Befestigung der veränderten funktionierte für mich sehr gut.Die Argumentation dahinter ist einfach: wenn sich etwas unveränderliches, dann ersetzen Sie ihn (als ganze Person), von wo es hingehört mit den gewünschten ein.
Hier ist ein Beispiel, wie dies zu tun:
Natürlich, man kann sich leicht ausrechnen, dass dieses snippet ist Teil einer generischen Methode, daher ist der Einsatz von
T
das ist ein template-parameter, undSet<T>()
.InformationsquelleAutor der Antwort Alexander Christov
Antwort, dass die oben genannten können EF 4.1+. Für diejenigen, die auf 4.0, versuchen Sie diese einfache Methode...nicht wirklich getestet, aber hab befestigen Sie und speichern Sie die änderungen.
InformationsquelleAutor der Antwort thomas gathings
Können Sie vergessen haben, instaçia das Objekt
fBLL = new FornecedorBLL();
in algun OrtInformationsquelleAutor der Antwort Junior Ramoty