Моя модель содержит класс Section
, который имеет упорядоченный список Statics
, которые являются частью этого раздела. Оставляя все остальные свойства, реализация модели выглядит так:
public class Section
{
public virtual int Id { get; private set; }
public virtual IList<Static> Statics { get; private set; }
}
public class Static
{
public virtual int Id { get; private set; }
}
В базе данных отношение реализовано как один-ко-многим, где таблица Static
имеет внешний ключ, указывающий на Section
, и целочисленный столбец Position
для хранения своей позиции индекса в списке. является частью.
Отображение выполняется в Fluent NHibernate следующим образом:
public SectionMap()
{
Id(x => x.Id);
HasMany(x => x.Statics).Cascade.All().LazyLoad()
.AsList(x => x.WithColumn("Position"));
}
public StaticMap()
{
Id(x => x.Id);
References(x => x.Section);
}
Теперь я могу загрузить существующие Static
s, и я также могу обновить их детали. Тем не менее, я не могу найти способ добавить новые Static
s к Section
, и эти изменения сохраняются в базе данных. Я пробовал несколько комбинаций:
mySection.Statics.Add(myStatic)
session.Update(mySection)
session.Save(myStatic)
но самое близкое, что я получил (используя первые два оператора), к исключению SQL: «Невозможно вставить значение NULL в столбец« Позиция »». Ясно, что здесь INSERT
предпринята попытка, но NHibernate, похоже, не добавляет автоматически позицию индекса в оператор SQL.
Что я делаю не так? Я что-то упускаю в своих отображениях? Нужно ли выставлять столбец Position
как свойство и присваивать ему значение самостоятельно?
РЕДАКТИРОВАТЬ: Очевидно, все работает, как ожидалось, если я уберу ограничение NOT NULL
для столбца Static.Position
в базе данных. Я думаю, NHibernate делает вставку и сразу после обновления строки со значением Position
.
Хотя это ответ на вопрос, я не уверен, что он самый лучший. Я бы предпочел, чтобы столбец Position
не обнулялся, поэтому я все еще надеюсь, что есть какой-то способ заставить NHibernate предоставить значение для этого столбца непосредственно в операторе INSERT
.
Таким образом, вопрос все еще открыт. Любые другие решения?