使用Fluent Nhibernate,我无法使用父对象ID在其参考列中保存子对象

时间:2012-06-25 00:06:00

标签: nhibernate fluent-nhibernate

典型问题 - 我试图用嵌套的新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。我已经看过很多例子,他们从来不必设置外键,并在映射中引用它。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

当然我在第16篇文章中找到了答案,我读到我必须在数据库中使用引用列允许null = true以及需要删除的反向。当我在没有反向指定的情况下尝试我的测试时(不仅我没有在此answer中引用的清楚理解)而且我没有将我的引用列设置为允许空值。

相关问题