典型问题 - 我正在尝试使用嵌套的新 IEnumerable 子对象保存新父对象,这些子对象都有引用列来存储父 ID,但我无法正确配置 NHibernate 以保存子对象。
它不会保存的原因是因为子表上引用父表记录 ID 的列设置为不允许为空。但是我无法在我的 HasMany 上找出正确的设置,这将允许 NHibernate 生成父记录 ID 并在子记录引用列中提供它。
因此,我最终得到“无法将 NULL 插入列......”错误。
因此,我在 Stackoverflow 上阅读了大量的问题/答案,并浏览了Ayende Rehien和Fluent 的 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; }
}
我的流利映射看起来像:
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);
}
}
我的 DB 架构设置为不允许 Attributes 和 AttributesValues 表上的引用列使用 null,但我尝试将其设置为 allow null,因为我已经读过它可以设置为返回并更新,但事实并非如此。
我无法找到为什么我不能保存子对象并让 Nhibernate 将父 ID 保存在引用的字段上。我见过很多例子,他们从来不需要设置外键,并在映射中引用它。
有什么想法吗?