NHibernate 5.1 ManyToOne - удалить сироту не работает должным образом - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть следующие объекты:

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()?

1 Ответ

0 голосов
/ 28 ноября 2018

После долгих поисков решения я обнаружил, что существует отображение Join, которое идеально подходит для вышеописанного сценария.

Надеюсь, это кому-нибудь поможет.

Больше информации здесь: http://notherdev.blogspot.com/2012/01/mapping-by-code-join.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...