Я пытаюсь установить отношения следующим образом.Каждый Мастер элемент имеет один или несколько Деталей элементов:
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
и Detail is:
DetailId uniqueidentifier NOT NULL
name nvarchar(max) NULL
MasterId uniqueidentifier NULL
foreign key (masterId) references [Master]
Мне действительно не нужна ссылка из Detail обратно на 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, а затем выполняет ОБНОВЛЕНИЕ, чтобы установить для него реальный MasterId.
Действительно, я не хочу записей сведений с NULL MasterIds,поэтому, если я установлю в поле MasterId значение NOT NULL, INSERT to Detail потерпит неудачу, потому что, как я сказал, NHibernate пытается ввести MasterId = NULL.
Я предполагаю, что мой вопрос сводится к следующему:
Как я могу получить приведенный выше пример кода для работы с моей существующей моделью домена (например, без добавления свойства Detail.Master), иПоле Detail.MasterId в базе данных имеет значение NOT NULL?
Есть ли способ заставить Nhibernate просто ввести правильный MasterId в начальную INSERT, вместо того, чтобы потом запускать UPDATE?Есть ли где-нибудь обоснование для этого дизайнерского решения?- Я изо всех сил пытаюсь понять, почему это будет сделано таким образом.