Я пытаюсь настроить отношения следующим образом. Каждый элемент Мастер имеет один или несколько элементов Подробно:
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<Detail> Details { get; set; }
}
И отображения:
public class MasterMap : ClassMap<Master>
{
public MasterMap()
{
Id(x => x.MasterId);
Map(x => x.Name);
HasMany(x => x.Details).Not.KeyNullable.Cascade.All();
}
}
public class DetailMap : ClassMap<Detail>
{
public DetailMap()
{
Id(x => x.Id);
Map(x => x.Name);
}
}
Таблица базы данных Мастер:
masterId uniqueidentifier NOT NULL
name nvarchar(max) NULL
и Подробно:
DetailId uniqueidentifier NOT NULL
name nvarchar(max) NULL
MasterId uniqueidentifier NULL
foreign key (masterId) references [Master]
Мне не нужно иметь ссылку из Detail back to Master - другими словами, объекты Detail сами по себе просто не интересны для моего домена. Они всегда будут доступны через свой объект "Мастер".
Используя такой код:
Master mast = new Master
{
MasterId = new Guid(),
Name = "test",
Details = new List<Detail>
{
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, затем устанавливает UPDATE это к реальному MasterId.
На самом деле, я не хочу подробные записи с помощью NULL MasterIds, поэтому, если я установил для поля MasterId значение NOT NULL, INSERT to Detail завершится неудачно, потому что, как я сказал, NHibernate пытается ввести MasterId = NULL.
Я думаю, мой вопрос сводится к следующему:
Как я могу заставить приведенный выше пример кода работать с моей существующей моделью домена (например, без добавления свойства Detail.Master) и в поле Detail.MasterId в базе данных, установленной в NOT NULL?
Есть ли способ заставить Nhibernate просто поместить правильный MasterId в начальный INSERT, а не после запуска UPDATE? Есть ли смысл в этом дизайнерском решении? - Я изо всех сил пытаюсь понять, почему так будет сделано.