【问题标题】:NHibernate many-to-one mappingNHibernate 多对一映射
【发布时间】:2020-04-03 21:18:53
【问题描述】:

实体类:

public class Purchase
{
   public virtual int PurchaseId { get; set; }
   public virtual int CustomerId { get; set; }
   public virtual Customer Customer { get; set;}
}

public class Customer
{
    public virtual int CustomerId { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
}

休眠配置:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="xxx" assembly="xxx">
  <class name="Purchase" table="Purchase">
    <id name="PurchaseId" column="PurchaseId" />
    <many-to-one name="Customer" column="CustomerId"/>
  </class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="xxx" assembly="xxx">
  <class name="Customer" table="Customer">
    <id name="CustomerId" column="CustomerId" />
    <property name="FirstName" column="FirstName" />
    <property name="LastName" column="LastName" />
  </class>
</hibernate-mapping>

我正在尝试将新购买保存到数据库:

 using (var session = _sessionFactory.Create())
 {
     var customer = new Customer { CustomerId = 1, FirstName = "John", LastName = "Smith" };
     var purchase = new Purchase { PurchaseId = 1, Customer = customer };

     session.Save(purchase);
     session.Flush();
 }

Purchase 表对 Customer 表有 FK。

我得到:“SqlException:无法将值 NULL 插入到列 'CustomerId'、表 'ORM.dbo.Purchase';列不允许空值。插入失败。”

我在想,我做错了什么。 非常感谢您的回答。

【问题讨论】:

  • 嗨,你使用什么样的生成器来生成键值?我在您发布的配置中看不到任何内容。文档说这是必需的。问题可能是 NHibernate 首先插入客户,然后不知道如何为其获取键值。 nhibernate.info/doc/nhibernate-reference/mapping.html
  • 让我知道,如果我的回答不能解决您的问题,我可以更详细地研究一下。祝你好运!
  • 不幸的是,我必须从代​​码生成密钥,而不是通过 Db。所以我可能需要其他解决方案。非常感谢您的宝贵时间。
  • 在这种情况下,请使用generator=assigned,我会更新我的答案
  • 一切正常,非常感谢!

标签: c# nhibernate


【解决方案1】:

问题可能是 NHibernate 并不真正知道将 CustomerId 的什么值插入到 Purchase 表中,因为它不知道如何获取该键。

您能否尝试更改映射以包含generator

请注意,根据 NHibernate Docs

generator:生成器类的名称,用于为持久类的实例生成唯一标识符。请参阅生成器元素。需要指定属性或元素。属性优先于元素。

现在,要选择哪个确切的生成器是一个更大的话题,这取决于您的用例,请参阅How to auto generate IDs in NHibernate 中的一些信息

如果您想在代码中分配键,您应该选择assigned 生成器,见下文

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="xxx" assembly="xxx">
  <class name="Purchase" table="Purchase">
    <id name="PurchaseId" column="PurchaseId" generator="assigned" />
    <many-to-one name="Customer" column="CustomerId"/>
  </class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="xxx" assembly="xxx">
  <class name="Customer" table="Customer">
    <id name="CustomerId" column="CustomerId" generator="assigned"/>
    <property name="FirstName" column="FirstName" />
    <property name="LastName" column="LastName" />
  </class>
</hibernate-mapping>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多