Я пытаюсь настроить однозначное сопоставление моих пользователей с таблицей UserDetails. Скажем, у меня в базе данных есть следующие таблицы:
Users:
- UserID (PK, Identity)
- UserName
- Password
UsersDetails:
- UserID (PK, FK)
- FirstName
- LastName
Я создал следующие классы поко:
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 () в свою ссылку, я получаю исходную ошибку, которую я получал о сгенерированном нулевом идентификаторе.