У меня есть следующие объекты:
public class Person {
public int Id {get;set;}
public String Name {get;set;}
public Passport Passport {get;set;}
}
public class Passport {
public int Id {get;set;}
public String PassportNo {get;set;}
// ... other properties
}
и следующее отображение (для Персона):
ManyToOne(x => x.Passport, m =>
{
m.Column("PassportId");
m.Lazy(LazyRelation.NoLazy);
m.Unique(true);
m.Cascade(Cascade.All | Cascade.DeleteOrphans);
});
Схема БД:
Table Person:
Id | Name | PassportId
Table Passport:
Id | PassportNo | other props.
Как мы видим, Person
имеет свой паспорт, но паспорт понятия не имеет о своем владельце, и это поведение, которое я хочу.Есть еще 2 предположения:
Person
может иметь только 1 паспорт за раз Passport
НЕ может существовать без человека
Проблемакогда я назначаю новый Passport
для Person
, старый Passport
остается в БД.
person.Passport = new Passport() { PassportNo = "AB 123456" };
// ...
session.Flush();
session.Commit();
Сгенерированные SQL-запросы: INSERT и UPDATE (вставляет новые Passport
, иобновляет Person
с новым Passport
) - , однако на потерянном старом паспорте нет УДАЛИТЬ .
Обходное решение, которое я нашел, - установить ток Passport
на null
,позвоните session.Flush()
и назначьте новое Passport
, например:
person.Passport = null;
session.Flush();
person.Passport = new Passport() { PassportNo = "AB 123456" };
// ...
session.Flush();
session.Commit();
, однако, IMO, это хакерское решение.
Итак, подытожив:
- я что-то упустил в своем отображении?
- выше поведения ошибка в NH?
- можно ли ее решить без хаки
Flush()
?