简体   繁体   English

NHibernate 多对一映射

[英]NHibernate many-to-one mapping

Entity classes:实体类:

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; }
}

hibernate configs: hibernate 配置:

<?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>

I am trying to save new purchase to database:我正在尝试将新购买保存到数据库:

 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 table have FK to Customer table.采购表有 FK 到客户表。

And I am getting: "SqlException: Cannot insert the value NULL into column 'CustomerId', table 'ORM.dbo.Purchase'; column does not allow nulls. INSERT fails."我得到:“SqlException:无法将值 NULL 插入 'CustomerId' 列,表 'ORM.dbo.Purchase';列不允许空值。插入失败。”

I am wondering, what I am doing wrong.我想知道,我做错了什么。 Thank you very much for anserw.非常感谢您的回答。

The problem might be that NHibernate does not really know what value of CustomerId to insert into the Purchase table, because it does not know how to obtain that key.问题可能是 NHibernate 并不真正知道要将CustomerId的什么值插入到Purchase表中,因为它不知道如何获取该键。

Could you please try and change the mapping to include a generator您能否尝试更改映射以包含 生成器

Please note that according to NHibernate Docs请注意,根据 NHibernate Docs

generator: The name of a generator class to use for generating unique identifiers for instances of the persistent class. generator:生成器 class 的名称,用于为持久 class 的实例生成唯一标识符。 See the generator element.请参阅生成器元素。 Specifying either the attribute or the element is required.需要指定属性或元素。 The attribute takes precedence over the element.属性优先于元素。

Now, which exact generator to pick, is a bigger topic that depends on your use cases, see some info in How to auto generate IDs in NHibernate现在,选择哪个确切的生成器是一个更大的主题,取决于您的用例,请参阅如何在 NHibernate 中自动生成 ID 中的一些信息

If you would like to assign keys in code, you should pick the assigned generator, see below如果您想在代码中分配键,您应该选择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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM