【问题标题】:NHibernate unidirectional one-to-one mapping problemNHibernate 单向一对一映射问题
【发布时间】:2010-01-25 18:33:49
【问题描述】:

我正在尝试使用 NHibernate 创建单向一对一关系。

示例:客户下订单。

Customer{ID, Name, Address}
OrderN{ID, Customer, OrderDate}

在这里,OrderN.Customer-field 旨在将 Customer.ID 存储为 FK。而且这个字段没有任何唯一性约束。

(OrderN 表被赋予这样的名称以避免 SQL 关键字冲突。)

问题是,执行这段 c# 代码后,OrderN.Customer-field 存储的是一个空值。

但它应该存储客户的 ID。 IE。 1.

如果我在 OrderN.hbm.xml 中添加<property name="Customer" column="Customer" />,则会引发异常:

Could not determine type for: NHibernate__One_To_One__Order_Customer.BO.Customer, NHibernate__One_To_One__Order_Customer.BO, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null, for columns: NHibernate.Mapping.Column(Customer)

如何解决这个问题?

可能不是一对一的关系。我实际上是想了解<one-to-one /> 标签的使用方式。有人可以在这方面帮助我吗?

客户.sql

CREATE TABLE [dbo].[Customer](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](50) NULL,
    [Address] [varchar](50) NULL,
 CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

客户.cs

public class Customer
{
    private int _id;
    public virtual int ID
    {
        get { return _id; }
        set { _id = value; }
    }

    private string _name;
    public virtual string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    private string _address;
    public virtual string Address
    {
        get { return _address; }
        set { _address = value; }
    }

}

客户.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping
  xmlns="urn:nhibernate-mapping-2.2"
  >
  <class name="NHibernate__One_To_One__Order_Customer.BO.Customer, NHibernate__One_To_One__Order_Customer.BO" table="Customer">
    <id name="ID" >
      <generator class="native" />
    </id>
    <property name="Name" column="Name" />      
    <property name="Address" column="Address" />
  </class>
</hibernate-mapping>

OrderN.sql

CREATE TABLE [dbo].[OrderN](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Customer] [int] NULL,
    [OrderDate] [datetime] NULL,
 CONSTRAINT [PK_Order] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
ALTER TABLE [dbo].[OrderN]  WITH CHECK ADD  CONSTRAINT [FK_Order_Customer] FOREIGN KEY([Customer])
REFERENCES [dbo].[Customer] ([ID])
GO
ALTER TABLE [dbo].[OrderN] CHECK CONSTRAINT [FK_Order_Customer]

OrderN.cs

public class OrderN
{
    private int _id;
    public virtual int ID
    {
        get { return _id; }
        set { _id = value; }
    }

    private Customer _customer;
    public virtual Customer Customer
    {
        get { return _customer; }
        set { _customer = value; }
    }

    private DateTime _orderDate;
    public virtual DateTime OrderDate
    {
        get { return _orderDate; }
        set { _orderDate = value; }
    }
}

OrderN.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping 
    xmlns="urn:nhibernate-mapping-2.2" 
    >
  <class name="NHibernate__One_To_One__Order_Customer.BO.OrderN, NHibernate__One_To_One__Order_Customer.BO" table="OrderN">
    <id name="ID">      
      <generator class="native" />
    </id>
    <property name="OrderDate" column="OrderDate"/>


    <one-to-one
        name="Customer"
        class="NHibernate__One_To_One__Order_Customer.BO.Customer, NHibernate__One_To_One__Order_Customer.BO" />


  </class>
</hibernate-mapping>

主程序

OrderN o = new OrderN();
o.OrderDate = DateTime.Now;
o.Customer = new Repository<Customer>().Get<Customer>(1);

Repository<OrderN> rep = new Repository<OrderN>();
rep.Save(o);

【问题讨论】:

    标签: nhibernate one-to-one


    【解决方案1】:

    所以一个客户只能有一个订单?我希望它是一个大的!

    这不是一对一的关系,而是一对多的关系。客户是一方,订单是多方(客户有订单)。尝试像这样映射它:

    <?xml version="1.0" encoding="utf-8" ?>
    
    <hibernate-mapping 
        xmlns="urn:nhibernate-mapping-2.2" 
        >
      <class name="NHibernate__One_To_One__Order_Customer.BO.OrderN, NHibernate__One_To_One__Order_Customer.BO" table="OrderN">
        <id name="ID">      
          <generator class="native" />
        </id>
        <property name="OrderDate" column="OrderDate"/>
    
    
        <many-to-one
            name="Customer"
            class="NHibernate__One_To_One__Order_Customer.BO.Customer, NHibernate__One_To_One__Order_Customer.BO"
            column="Customer" />
    
    
      </class>
    </hibernate-mapping>
    

    【讨论】:

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