NHibernate unidirektionalen eine Eins-zu-Eins-Abbildung Problem
-
22-09-2019 - |
Frage
Ich versuche, eine unidirektionale Eins-zu-Eins-Beziehung mit NHibernate zu erstellen.
. Beispiel: Ein Auftrag von einem Kunden gegeben ist
Customer{ID, Name, Address}
OrderN{ID, Customer, OrderDate}
Hier wird OrderN.Customer-Feld soll Customer.ID als FK speichern. Und dieses Feld hat keine eindeutige Einschränkung.
(Die Ordern-Tabelle angegeben ist, so ein Name zu vermeiden SQL-Schlüsselwort-Konflikt.)
Das Problem ist, c # Nachdem diese Ausführung von Code, OrderN.Customer Feld einen Nullwert speichert.
Aber es sollte die ID des Kunden speichern. D. h 1.
Und wenn ich <property name="Customer" column="Customer" />
in OrderN.hbm.xml hinzufügen, wird eine Ausnahme ausgelöst:
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)
Wie dieses Problem zu lösen?
Vielleicht ist es kein Verhältnis eins zu eins ist. Ich versuche wirklich zu verstehen, wie der <one-to-one />
-Tag verwendet. Kann jemand mir helfen, in diesem Zusammenhang bitte?
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-Programm
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);
Lösung
So kann ein Kunde immer nur einen Auftrag haben? Ich hoffe, es ist ein großer!
Dies ist keine Eins-zu-Eins-Beziehung, es ist eine Eins-zu-viele. Kunde ist die eine Seite, und Ordnung ist, die viele (Kunde hat Aufträge). Versuchen Sie die Abbildung es wie folgt aus:
<?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>