Question

Je suis en train de créer un Unidirectionnel one-to-one relation à l'aide NHibernate.

Exemple:. Un ordre est donné par un client

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

Ici, OrderN.Customer-champ est destiné à stocker Customer.ID comme FK. Et ce domaine n'a pas de contrainte unique.

(Le ordern table est donné un nom pour éviter les conflits de mots clés SQL.)

Le problème est, après l'exécution de ce code C #, OrderN.Customer champ stocke une valeur nulle.

Mais il était censé stocker l'ID du Client. C'est à dire. 1.

Et si j'ajoute <property name="Customer" column="Customer" /> dans OrderN.hbm.xml, une exception est levée:

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)

Comment résoudre ce problème?

Peut être que ce n'est pas une à une relation. Je en train d'essayer de comprendre comment est la balise <one-to-one /> utilisée. Quelqu'un peut-il me aider s'il vous plaît à cet égard?

Customer.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]

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

}

Customer.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>

Main-programme

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);
Était-ce utile?

La solution

Ainsi, un client ne peut avoir qu'un seul ordre? J'espère que c'est un grand!

Ce n'est pas une à une relation, il est un à plusieurs. Le client est d'un côté, et l'ordre est le nombre (client a des commandes). Essayez de la cartographie comme ceci:

<?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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top