NHibernate 1对多的问题

ranmer ranmer 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

子实体,使用了复合主键,我在网上找了很多方法,还是没解决,以下是代码和异常:

order的实体和映射
namespace NhTest.Model
{
[Serializable]
public class Order
{

public virtual int ID { get; set; }

public virtual String CustomerName { get; set; }

public virtual decimal TotalAmt { get; set; }

public virtual DateTime Created { get; set; }

public virtual String Status { get; set; }

public virtual IList<OrderDetail> Items { get; set; }
}
}



<?xml version="1.0" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="NhTest"
namespace="NhTest.Model">

<class name="Order" table="[Order]">
<id name="ID">
<generator class="native" />
</id>

<property name="Created" />
<property name="CustomerName"/>
<property name="TotalAmt" column="Amt"/>
<property name="Status"/>

<bag name="Items" table="OrderDetail" generic="true" inverse="true" cascade="all">
<key column="OrderID" foreign-key="FK_OrderDetail"></key>
<one-to-many class="OrderDetail"/>
</bag>

</class>
</hibernate-mapping>



orderdetail 的实体和映射
 public class OrderDetailPK
{

public virtual int OrderID { get; set; }

public virtual int RowNumber { get; set; }


public override bool Equals(object obj)
{
if (obj is OrderDetailPK)
{
var second = obj as OrderDetailPK;
if (this.OrderID == second.OrderID
&& this.RowNumber == second.RowNumber)
{
return true;
}
else return false;
}
return false;
}

public override int GetHashCode()
{
return base.GetHashCode();
}
}

[Serializable]
public class OrderDetail
{
public virtual OrderDetailPK PK { get; set; }

public virtual int PKComposite_Orderid { get; set; }

public virtual int PKComposite_RowNumber { get; set; }

public virtual String ProductName { get; set; }

public virtual int Qty { get; set; }

public virtual decimal Price { get; set; }

public virtual Order Order { get; set; }

}


<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="NhTest"
namespace="NhTest.Model">

<class name="OrderDetail">

<composite-id name="PK" class="OrderDetailPK">
<key-many-to-one name="OrderID" column="OrderID" class="Order"/>
<!--<key-property name="OrderID" column="OrderID"></key-property>-->
<key-property name="RowNumber" column="RowNumber"/>
</composite-id>


<property name="PKComposite_Orderid" not-null="true" formula="OrderID" />
<property name="PKComposite_RowNumber" not-null="true" formula="RowNumber" />

<property name="ProductName"/>
<property name="Price"/>
<property name="Qty"/>

<many-to-one name="Order" column="OrderID" class="Order" not-null="true" foreign-key="FK_OrderDetail">
</many-to-one>

</class>
</hibernate-mapping>



调用方法

Order ord = new Order();
//ord.ID = 10;
ord.CustomerName = "张三";
ord.Created = DateTime.Now;
ord.Status = "ok";
ord.TotalAmt = 100;
ord.Items = new List<OrderDetail>();

ord.Items.Add(new OrderDetail()
{
PK=new OrderDetailPK(){
OrderID=9,
RowNumber=1,
},
PKComposite_Orderid=9,
PKComposite_RowNumber=1,
Price=34,
Qty=23,
ProductName="王老吉",
Order=ord
});

//session.save(ord);
...全文
评论 4
收藏 已收藏
分享
返回顶部
ranmer
C# 111,129 成员 642,539 内容