2012-03-29 12 views
2

Könnte mir jemand dabei helfen:Oracle ODP.Net und EF CodeFirst - Savechanges Fehler

Der Code:

Role r = new Role { ID = 1, Name = "Members" }; 
ctx.Roles.Attach(r); 

//Saving User 
User u = new User { 
    Login = login, 
    Password = password, 
    Status = 1 
}; 
u.Roles.Add(r); 

ctx.Users.Add(u); 
ctx.SaveChanges(); 

Was ich versuche zu tun ist, um einen neuen Benutzer mit einem vorhandenen speichern Rolle. Benutzer- und Rollenklassen haben eine many-to-many-Beziehung durch fließend-api wie folgt abgebildet:

modelBuilder.Entity<User>() 
.HasMany(u => u.Roles) 
.WithMany(r => r.Users) 
.Map(x => { 
    x.ToTable("USER_ROLE_XREF", dbsch); 
    x.MapLeftKey("ID_USER"); 
    x.MapRightKey("ID_ROLE"); 
}); 

Aber wenn der Savechanges aufgerufen wird, bekomme ich diesen Fehler: { "Der angegebene Wert ist keine Instanz des Typs ‚Edm.Decimal‘ \ r \ nParameter Name: Wert "}

Eigentlich immer versuche ich mit einem einzigen Savechanges verbundenen Unternehmen zu speichern() nenne ich den gleichen Fehler. so, was ich zu tun hatte, diese zu Zahl war mehrere Anrufe zu tätigen und so gut funktioniert:

Role r = new Role { ID = 1, Name = "Members" }; 
ctx.Roles.Attach(r); 

//Saving User 
User u = new User { 
    Login = login, 
    Password = password, 
    Status = 1 
}; 

ctx.Users.Add(u); 
ctx.SaveChanges(); 

//Assigning Member Role 
u.Roles.Add(r); 
ctx.SaveChanges(); 

Es ist mein Verständnis, dass EF Unterstützung mehr Änderungen mit einem einzelnen Savechanges aufruf zu speichern, so fragt ich mich, was falsch hier.

Antwort

0

Die Idee mit der Attach() Methode ist, dass Sie eine Entität haben, von der bekannt ist, dass sie in der DB ist, aber nicht von diesem Kontext verfolgt wird, oder? Meine Frage an Sie ist, wissen Sie sicher, dass diese Rolle hier:

Role r = new Role { ID = 1, Name = "Members" }; 

ist etwas, das bereits existiert? Wenn es nicht der Fall ist, glaube ich nicht, was Sie tun wollen

ist verwenden
ctx.Roles.Attach(r); 

eher ist es, dass Sie schreiben würde:

ctx.Roles.Add(r); 

und dann könnte man sich umdrehen und schreiben

Das Problem, das Ihr erstes Beispiel hat, ist, dass diese neue Rolle wirklich neu für die DB ist. Daher ist es nicht das, was Sie tun möchten, sondern Sie möchten es hinzufügen.

Und der einzige Anruf zu ctx.SaveChanges() sollte hier gut funktionieren.

+0

Hey Matt, danke für die Antwort. Aber ja, die Rolle existiert bereits in der Datenbank. Aber nehmen wir an, dass es neu ist (mit einer Diff-ID natürlich) und ich die Add-Methode anstelle von Attach verwende, bekomme ich den gleichen Fehler. Im Allgemeinen geschieht dies immer, wenn ich versuche, mehrere verbundene Entitäten mit einem einzigen SaveChanges-Aufruf hinzuzufügen (oder zu aktualisieren). – fcaldera

Verwandte Themen