Pregunta

Estoy intentando crear una unidireccional uno-a-uno utilizando NHibernate.

Ejemplo:. Una orden es dada por un cliente

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

A continuación, OrderN.Customer campo está destinado a almacenar Customer.ID como FK. Y este campo no tiene ninguna restricción única.

(El ordern mesa se le da un nombre a un conflicto de palabras clave evitar SQL.)

El problema es, después de la ejecución de este código C #, OrderN.Customer-campo es el almacenamiento de un valor nulo.

Pero se suponía que era para almacenar el ID del cliente. Es decir. 1.

Y si añado <property name="Customer" column="Customer" /> en OrderN.hbm.xml, se produce una excepción:

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)

¿Cómo resolver este problema?

Puede ser que no es una relación uno-a-uno. De hecho, estoy tratando de entender cómo se utiliza la etiqueta <one-to-one />. ¿Puede alguien por favor me ayuda en este sentido?

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>

Principal-programa

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);
¿Fue útil?

Solución

Así que un cliente puede tener sólo alguna vez una orden? Espero que sea un grande!

Esto no es una relación uno-a-uno, es de uno a muchos. El cliente es, por un lado, y el orden es el muchos (cliente tiene pedidos). Trate de mapeo de esta manera:

<?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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top