私のモデルには、このセクションの一部で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; }
}
データベースでは、リレーションシップは 1 対多として実装されます。テーブル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)
しかし、(最初の2つのステートメントを使用して)得た最も近いものは、SQL例外の読み取りです:「列 'Position'に値NULLを挿入できません」。ここでは明らかに anINSERT
が試みられていますが、NHibernate はインデックス位置を SQL ステートメントに自動的に追加していないようです。
私は何を間違っていますか?マッピングに欠けているものはありますか? 列をプロパティとして公開し、Position
自分で値を割り当てる必要がありますか?
編集:データベース内NOT NULL
の列の制約を削除すると、すべてが期待どおりに機能するようです。Static.Position
私はNHibernateが挿入を行い、すぐに行をPosition
値で更新すると思います。
これは質問に対する答えですが、それが最良のものかどうかはわかりません。列がnull可能でないことを望んでいるので、NHibernateがステートメントPosition
でその列に直接値を提供するようにする方法があることを願っています。INSERT
したがって、質問はまだ開いています。他の解決策はありますか?