Ich versuche, eine Eins-zu-Eins-Zuordnung von meinen Benutzern zur Tabelle UserDetails einzurichten. Sagen, dass ich die folgenden Tabellen in meiner Datenbank haben:Zuordnung 1: 1-Zuordnung erlaubt kein Einfügen
Users:
- UserID (PK, Identity)
- UserName
- Password
UsersDetails:
- UserID (PK, FK)
- FirstName
- LastName
ich folgende poco Klassen erstellt haben:
public class User {
public virtual int UserID { get; set; }
public virtual string UserName { get; set; }
public virtual string Password { get; set; }
public virtual UserDetails Details { get; set; }
}
public class UserDetails {
public virtual int UserID { get; set; }
public virtual User User { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public UserDetails() {
}
public UserDetails(User user) {
User = user;
}
}
Welche fließend abgebildet werden (bitte die XML-Mapping beachten sehr ähnlich ist und wenn alles, was Sie wissen, die xML-Mapping ist dann würde ich schätzen Sie Führung noch):
public class UserMap : ClassMap<User> {
public UserMap() {
Table("Users");
Id(x => x.UserID);
Map(x => x.UserName);
Map(x => x.Password);
HasOne(x => x.Details)
.Constrained()
.Cascade.All();
}
}
public class UserDetailsMap : ClassMap<UserDetails> {
public UserDetailsMap() {
Table("UsersDetails");
Id(x => x.UserID)
.GeneratedBy.Foreign("User");
HasOne(x => x.User)
.Constrained();
Map(x => x.FirstName);
Map(x => x.LastName);
}
}
Alles korrekt angezeigt, aber wenn ich sage:
var user = new User() { UserName = "Test", Password = "Test" };
user.Details = new UserDetails(user) { FirstName = "Test", LastName = "Test" };
session.Save(user);
ich den Fehler:
"NHibernate.Id.IdentifierGenerationException: null ID erstellt für:. Userdetails"
Ich würde es wirklich schätzen, wenn mir jemand zeigen könnte, was ich falsch gemacht habe. Danke
Bearbeiten: Mit freundlicher Genehmigung von Jamie Ide's Vorschlag. Ich habe meine Benutzerzuordnung geändert:
public class UserMap : ClassMap<User> {
public UserMap() {
Table("Users");
Id(x => x.UserID);
Map(x => x.UserName);
Map(x => x.Password);
References(x => x.Details, "UserID")
.Class<UserDetails>()
.Unique();
}
}
Aber jetzt, wenn ich einen Benutzer einfügen bekomme ich den Fehler:
„System.ArgumentOutOfRangeException: Index war außerhalb des Bereichs muss nicht negativ sein und weniger als. die Größe der Sammlung. "
Wenn ich Cascade.All() zu meiner Referenz hinzufügen, erhalte ich den ursprünglichen Fehler, den ich über die erzeugte Null-ID erhielt.
Prost, aber das Feld UserID in der Tabelle UsersDetails ist ein Verweis auf die Tabelle Benutzer, die die automatisch inkrementierende ID enthält. Da es sich um eine Eins-zu-eins-Zuordnung handelt, ist die Benutzer-ID in der Tabelle UsersDetails auch der Primärschlüssel. Ich hoffe, das hilft. – nfplee