Конфигурация NHibernate для однонаправленного отношения «один-ко-многим»

Я пытаюсь установить отношения следующим образом. Каждый элемент Master имеет один или несколько элементов Detail :

public class Detail {
    public virtual Guid DetailId { get; set; }
    public virtual string Name { get; set; }
}
public class Master {
    public virtual Guid MasterId { get; set; }
    public virtual string Name { get; set; }
    public virtual IList Details { get; set; }
}

И сопоставления:

public class MasterMap : ClassMap 
{
    public MasterMap() 
    {
        Id(x => x.MasterId);
        Map(x => x.Name);
        HasMany(x => x.Details).Not.KeyNullable.Cascade.All();
    }
}
public class DetailMap : ClassMap 
{
    public DetailMap() 
    {
        Id(x => x.Id);
        Map(x => x.Name);
    }
}

Таблица базы данных Master :

masterId   uniqueidentifier NOT NULL
name       nvarchar(max) NULL

и Деталь :

DetailId   uniqueidentifier NOT NULL
name       nvarchar(max) NULL
MasterId   uniqueidentifier NULL
foreign key (masterId) references [Master]

Я не Мне действительно важно иметь ссылку от Детализации обратно на Мастер - другими словами, объекты Детализации сами по себе просто не интересны для моего уровня домена. Они будут всегда доступны через их главный объект.

Используя такой код:

Master mast = new Master 
{
    MasterId = new Guid(),
    Name = "test",
    Details = new List 
    {
        new Detail { .DetailId = new Guid(), .Name = "Test1" },
        new Detail { .DetailId = new Guid(), .Name = "Test1" }
    }
};

using (transaction == Session.BeginTransaction) 
{
    Session.Save(mast);
    transaction.Commit();
}

Это отлично работает, за исключением сумасшедшего ограничения, описанного в этом сообщении : NHibernate делает INSERT и сначала помещает Detail.MasterId как NULL, затем выполняет ОБНОВЛЕНИЕ, чтобы установить для него реальный MasterId.

На самом деле, мне не нужны записи Detail с NULL MasterIds, поэтому, если я установлю для поля MasterId значение NOT NULL, INSERT to Detail потерпит неудачу, потому что, как я уже сказал, NHibernate пытается ввести MasterId = NULL.

Думаю, мой вопрос сводится к следующему:

Как я могу заставить приведенный выше пример кода работать с моей существующей моделью предметной области (например, без добавления свойства Detail.Master) и Detail. Для поля MasterId в базе данных задано значение NOT NULL?

Есть ли способ заставить Nhibernate просто ввести правильный MasterId в начальный INSERT, а не запускать UPDATE после этого? Есть ли где-нибудь обоснование такого дизайнерского решения? - Я изо всех сил пытаюсь понять, почему это было сделано именно так.

18
задан Community 23 May 2017 в 11:55
поделиться