Я пытаюсь установить отношения следующим образом. Каждый элемент 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 после этого? Есть ли где-нибудь обоснование такого дизайнерского решения? - Я изо всех сил пытаюсь понять, почему это было сделано именно так.