0

典型问题 - 我正在尝试使用嵌套的新 IEnumerable 子对象保存新父对象,这些子对象都有引用列来存储父 ID,但我无法正确配置 NHibernate 以保存子对象。

它不会保存的原因是因为子表上引用父表记录 ID 的列设置为不允许为空。但是我无法在我的 HasMany 上找出正确的设置,这将允许 NHibernate 生成父记录 ID 并在子记录引用列中提供它。

因此,我最终得到“无法将 NULL 插入列......”错误。

因此,我在 Stackoverflow 上阅读了大量的问题/答案,并浏览了Ayende RehienFluent 的 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 保存在引用的字段上。我见过很多例子,他们从来不需要设置外键,并在映射中引用它。

有什么想法吗?

4

1 回答 1

2

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

于 2012-06-25T00:30:31.113 回答