【问题标题】:With Fluent Nhibernate I can't get child objects to save with parent object ID in their reference colum使用 Fluent Nhibernate,我无法在其参考列中使用父对象 ID 保存子对象
【发布时间】:2012-06-26 06:51:51
【问题描述】:

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

它不会保存的原因是因为子表上引用父表记录ID的列设置为不允许为空。但是我无法在我的 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);
    }
}

我的 DB 模式设置为不允许 Attributes 和 AttributesValues 表上的引用列使用空值,但我已将其尝试为允许空值,因为我读过它可以设置为返回并更新,但那不是案例。

我无法找到为什么我不能保存子对象并让 Nhibernate 将父 ID 保存在引用的字段上。我见过很多例子,他们从来不需要设置外键,并在映射中引用它。

有什么想法吗?

【问题讨论】:

    标签: nhibernate fluent-nhibernate


    【解决方案1】:

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

    【讨论】:

    • 你是如何引导数据库的。你应该使用 Nhibernates ExposeConfiguration API 根据映射创建表以避免此类问题。
    • 我们使用内部应用程序来创建/管理数据库架构。
    猜你喜欢
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 2021-05-31
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多