7

Ich habe ein Unternehmen mit einer Fremdschlüsselbeziehung zu einer asp.net Mitgliedschaftsanbieter Benutzer-Tabelle.Entity Framework - Ein Artikel mit demselben Schlüssel wurde bereits hinzugefügt. - Fehler beim Versuch, Fremdschlüsselbeziehung zu definieren

Dieser Teil des Modells sieht wie folgt aus:

alt text

Ich kann die Fremdschlüsselbeziehung zu vergeben scheinen, wenn der Benutzer Tabellensatz eingeführt wird, die Aufzeichnung der Fremdschlüssel für die Tabelle mit aspnet_Users . Ich halte den Fehler bekommen:

An item with the same key has already been added.

Der Code Ich verwende sieht aus wie:

UserAdmin userToAdd = new UserAdmin(); 
... 
userToAdd.aspnet_Users = membershipUser; 
//line above OR line below 
userToAdd.aspnet_UsersReference.EntityKey = new System.Data.EntityKey("ProjectEntities.aspnet_Users", "UserId", membershipUser.UserId); 

db.AddToUsers(userToAdd); 
db.SaveChanges(); 

Ist das Problem, dass ich das EF bin gefragt eine neue aspnet_Users Tabelle Datensatz hinzufügen (der Datensatz für die zugehörige Primärschlüsseltabelle) wenn dieser Datensatz bereits vorhanden ist?

Wie würde ich einen Fremdschlüssel Wert zu einer Einheit zuzuweisen, wo der Primärschlüssel Satz bereits vorhanden ist?

Aktualisiert Testcodeblock:

MembershipUser membershipUser = Membership.CreateUser("[email protected]", "pass", "[email protected]"); 

Entities db = new Entities(); 
UserAdmin newUser = new UserAdmin(); 
newUser.Name = "blah"; 
newUser.DateAdded = DateTime.Now; 

Guid key = new Guid(membershipUser.ProviderUserKey.ToString()); 
aspnet_Users membershipUserRecord = db.aspnet_Users.Where(u => u.UserId == key).FirstOrDefault(); 
newUser.aspnet_Users = membershipUserRecord; 
//newUser.aspnet_UsersReference.EntityKey = new System.Data.EntityKey("Entities.aspnet_Users", "UserId", membershipUserRecord.UserId); 
db.ObjectStateManager.ChangeObjectState(membershipUserRecord, EntityState.Unchanged); 

db.AddToUsers(newUser); 
db.SaveChanges(); 

Dieser Code erzeugt den Fehler:

An item with the same key has already been added.

+1

Ist 'membershipUser' durch die (gleichen) Datacontext verfolgt? –

+2

Ja, der MembershipUser-Datensatz wurde von derselben Instanz des Entitätsmodells abgerufen, mit der der neue Benutzerdatensatz festgeschrieben wurde. – BrooklynDev

Antwort

8

OK dachte ich dieses heraus. Wie immer habe ich nur einen Fehler gemacht und es nicht sofort eingefangen, weil ich an der falschen Stelle gesucht habe.

Das Problem war aufgrund meiner Tabelle Vererbung und die Konfiguration auf Datenbankebene. Ich hatte das Fremdschlüsselfeld der Kindtabelle (UserAdmin) als eine Identität definiert, die dann in meinem Modell als StoreGeneratedPattern = Identity angezeigt wurde. Dies führte dazu, dass "Ein Element mit demselben Schlüssel wurde bereits Fehler hinzugefügt wurde", wenn EF versuchte, den Primärschlüssel des Elterns auf das Fremdschlüsselfeld des Kindes zu übertragen.

Sobald ich die Identität Spezifikation aus der Tabelle entfernt UserAdmins das Problem wegging.

Problem gelöst.

2

Ja, das ist genau das Problem. Wie hast du die MitgliedschaftUser-Entity bekommen? Wenn Sie es nicht von aktuellem ObjectContext erhalten haben EF denkt, dass es das neue ist und versucht es in die Tabelle aspnet_users einzufügen.

Versuchen Sie diesen Code zu verwenden, nachdem Benutzer ObjectSet Zugabe:

// db is ObjectContext instance 
db.ObjectStateManager.ChangeObjectState(membershipUser, EntityState.Unchanged); 

thereâ wahrscheinlich einige andere Möglichkeiten, wie gleiche Ergebnis zu erzielen, aber das funktioniert für mich.

+1

Ich habe versucht, ChangeObjectState(), aber ohne Erfolg, immer noch die Fehlermeldung "ein Element mit dem gleichen Schlüssel wurde bereits hinzugefügt" Fehler. Ich habe meinen Testcode in den ursprünglichen Post eingefügt. – BrooklynDev

+0

Ich habe Ihren Code überprüft und es sollte funktionieren. Wenn Sie einen Aspnet-Benutzer per EF auswählen, müssen Sie seinen Status nicht festlegen, da er bereits unverändert ist. Ist die Benutzertabelle leer? Wird UserId in der Benutzertabelle automatisch generiert?Wenn Sie SQL Server verwenden und wenn SQL Profiler installiert ist, können Sie überprüfen, welche SQL-Befehle ausgeführt werden. –

+0

Ich habe ein Profil in der Datenbank ausgeführt und ich sehe keine INSERT-Anweisungen, nachdem der Membership-Provider es für Membership.CreateUser() getan hat. Das Aufrufen von SaveChanges() scheint keine Einfüge- oder Aktualisierungsanweisungen für die Datenbank auszuführen. – BrooklynDev

Verwandte Themen