Моя модель содержит класс 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
, а также обновлять информацию о них. Однако я не могу найти способ добавить новые Static
в Section
и сохранить это изменение в базе данных. Я пробовал несколько комбинаций:
mySection.Statics.Add(myStatic)
session.Update(mySection)
session.Save(myStatic)
но самое близкое, что я получил (с использованием первых двух операторов), - это чтение исключения SQL: «Невозможно вставить значение NULL в столбец« Позиция »». Очевидно, здесь делается попытка INSERT
, но NHibernate, похоже, не добавляет автоматически позицию индекса к оператору SQL.
Что я делаю неправильно? Я что-то упускаю в сопоставлениях? Нужно ли мне выставлять столбец Position
как свойство и самому назначать ему значение?
РЕДАКТИРОВАТЬ: По-видимому, все работает, как ожидалось, если я удалю ограничение NOT NULL
для столбца Static.Position
в базе данных. Я предполагаю, что NHibernate делает вставку и сразу после обновления строки со значением Position
.
Хотя это ответ на вопрос, я не уверен, что он лучший. Я бы предпочел, чтобы столбец Position
не допускал значения NULL, поэтому я все же надеюсь, что есть способ заставить NHibernate предоставлять значение для этого столбца непосредственно в операторе INSERT
.
Таким образом, вопрос остается открытым. Какие-нибудь другие решения?