Я пытаюсь настроить однозначное сопоставление моих пользователей с таблицей UserDetails.Допустим, в моей базе данных есть следующие таблицы:
Users:
- UserID (PK, Identity)
- UserName
- Password
UsersDetails:
- UserID (PK, FK)
- FirstName
- LastName
Я создал следующие классы poco:
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;
}
}
, которые свободно отображаются (обратите внимание, что отображение xml очень похоже иесли все, что вы знаете, это отображение xml, то я все равно буду признателен вам за указание):
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);
}
}
Все отображается правильно, но если я скажу:
var user = new User() { UserName = "Test", Password = "Test" };
user.Details = new UserDetails(user) { FirstName = "Test", LastName = "Test" };
session.Save(user);
Я получу ошибку:
"NHibernate.Id.IdentifierGenerationException: пустой идентификатор, сгенерированный для: UserDetails."
Я был бы очень признателен, если бы кто-то мог показать мне, что я сделал неправильно.Спасибо
Редактировать: Предоставлено предложение Джейми Иде.Я изменил свое сопоставление пользователя на:
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();
}
}
Но теперь, когда я вставляю пользователя, я получаю сообщение об ошибке:
"System.ArgumentOutOfRangeException: индекс был вне диапазона. Должен быть неотрицательно и меньше размера коллекции. "
Если я добавлю Cascade.All () в свою ссылку, я получу исходную ошибку, которую я получаю о сгенерированном нулевом идентификаторе.