我的模型包含一个类,该类具有本节一部分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 添加到 a的方法Section
,并将此更改保留到数据库中。我尝试了几种组合:
mySection.Statics.Add(myStatic)
session.Update(mySection)
session.Save(myStatic)
但我得到的最接近的(使用前两个语句)是 SQL 异常读取:“无法将值 NULL 插入到列 'Position'”。显然INSERT
这里尝试了 an,但 NHibernate 似乎不会自动将索引位置附加到 SQL 语句中。
我究竟做错了什么?我在映射中遗漏了什么吗?我是否需要将Position
列公开为属性并自己为其赋值?
编辑:如果我删除数据库中列的NOT NULL
约束,显然一切都按预期工作。Static.Position
我猜 NHibernate 会在使用值更新行后立即进行插入Position
。
虽然这是对问题的回答,但我不确定它是否是最好的。我希望该Position
列不可为空,因此我仍然希望有某种方法可以使 NHibernate 直接在INSERT
语句中为该列提供值。
因此,这个问题仍然悬而未决。还有其他解决方案吗?