典型问题 - 我试图用嵌套的新IEnumerable子对象保存新的父对象,这些子对象都有引用列来存储父ID,但我无法正确配置NHibernate来保存子对象。
它不会保存的原因是因为子表上引用父表记录ID的列被设置为不允许null。但我无法弄清楚我的HasMany上的正确设置,它将允许NHibernate生成父记录ID并在子记录引用列中提供。
因此我最终得到“无法将NULL插入列.....”错误。
所以我在Stackoverflow上阅读了大量问题/答案,并通过了Ayende Rehien's以及Fluent's Wiki,我尝试了许多不同的设置无济于事(即删除逆,不同的级联选项..)。
目前我的实体看起来像这样:
public class Product
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IEnumerable<Attribute> Attributes { get; set; }
}
public class Attribute
{
public virtual int Id { get; set; }
public virtual Product Product { get; set; }
public virtual IEnumerable<AttributeValue> Values { get; set; }
}
public class AttributeValue
{
public virtual int Id { get; set; }
public virtual Attribute Attribute { get; set; }
public virtual string Value { get; set; }
}
我的Fluent映射看起来像:
public class ProductMap : ClassMap<Product>
{
public ProductMap()
{
Id(x => x.Id);
Map(x => x.Name);
Map(x => x.Description);
HasMany(x => x.Attributes).Inverse().Cascade.All();
}
}
public class AttributeMap : ClassMap<Attribute>
{
public AttributeMap()
{
Id(x => x.Id);
Map(x => x.Name);
References(x => x.Product);
HasMany(x => x.Values).Inverse().Cascade.All();
}
}
public class AttributeValueMap : ClassMap<AttributeValue>
{
public AttributeValueMap()
{
Id(x => x.Id);
Map(x => x.Value);
References(x => x.Attribute);
}
}
我的数据库架构设置为不允许Attributes和AttributesValues表上的引用列的空值,但我已经尝试将其作为allow null,因为我已经读过它可以设置为返回并更新但不是情况下。
我无法找到为什么我无法保存子对象并让Nhibernate在引用字段上保存父ID。我已经看过很多例子,他们从来不必设置外键,并在映射中引用它。
有什么想法吗?
答案 0 :(得分:2)
当然我在第16篇文章中找到了答案,我读到我必须在数据库中使用引用列允许null = true以及需要删除的反向。当我在没有反向指定的情况下尝试我的测试时(不仅我没有在此answer中引用的清楚理解)而且我没有将我的引用列设置为允许空值。