我的模型包含一个类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 to a Section
,并将此更改保存到数据库中。我尝试了几种组合:
mySection.Statics.Add(myStatic)
session.Update(mySection)
session.Save(myStatic)
但我得到的最接近的结果(使用前两条语句)是 SQL 异常:“无法将 NULL 值插入列‘位置’”。显然是一个INSERT
这里尝试了,但是NHibernate似乎没有自动将索引位置追加到SQL语句中。
我究竟做错了什么?我的映射中是否遗漏了某些内容?我需要曝光吗Position
列作为属性并自己为其赋值?
EDIT:显然,如果我删除,一切都会按预期进行NOT NULL
的约束Static.Position
数据库中的列。我猜 NHibernate 会进行插入,并在更新行后立即使用Position
value.
虽然这是问题的答案,但我不确定这是否是最好的答案。我更喜欢Position
列不可为空,所以我仍然希望有某种方法可以让 NHibernate 直接在INSERT
陈述。
因此,这个问题仍然悬而未决。还有其他解决方案吗?