使用非主键的流利休眠一对一映射
本文关键字:利休 休眠 一对一 映射 | 更新日期: 2023-09-27 18:35:36
无法找出下表的正确映射。
Table: ItemSale {ItemCode, SaleDate, Qty, SaleCode}
ItemCode and SaleDate are composite key.
SaleCode is a derived column, generated from the combination of ItemCode and SaleDate column.
Table: ItemSaleDetail {SaleCode, Agent}
SaleCode is a primary key and foreign key from ItemSale table for SaleCode column.
实体及其映射如下所示。
商品销售
public class ItemSale
{
public virtual string ItemCode { get; set; }
public virtual string Date { get; set; }
public virtual string SaleCode { get; set; }
public virtual ItemSaleDetail SaleDetail { get; set; }
}
public class ItemSaleMap : ClassMap<ItemSale>
{
public ItemSaleMap()
{
Table("ItemSale");
CompositeId()
.KeyReference(x => x.ItemCode, "ItemCode")
.KeyProperty(x => x.Date, "SaleDate");
HasOne(x => x.SaleDetail).Cascade.All();
}
}
项目销售详情
public class ItemSaleDetail
{
public virtual string ItemSaleCode { get; set; }
public virtual string Agent { get; set; }
public virtual ItemSale SaleParent { get; set; }
}
public class ItemSaleDetailMap : ClassMap<ItemSaleDetail>
{
public ItemSaleDetailMap()
{
Table("ItemSaleDetail");
Id(x => x.ItemSaleCode).GeneratedBy.Foreign("SaleParent");
Map(x => x.Agent, "Agent");
HasOne(x => x.SaleParent).Constrained();
}
}
我已经在上面给出了以传统方式使用的基本一对一映射,我知道在这种情况下是错误的。在这种情况下,请建议如何提供正确的映射。此外,如果派生列 SaleCode 由应用程序生成,我们如何在我的实体中拥有此属性。因为不允许对单个列进行多个映射。
好的,使用可分配的 ID,我们可以这样做。首先,我们应该确定 ID 已分配,因此我们可以像这样调整<id>
ItemSaleCode
的 getter:
public class ItemSaleDetail
{
string _itemSaleCode;
public virtual string ItemSaleCode
{
get { return _itemSaleCode ?? SaleParent.SaleCode ; }
set { _itemSaleCode = value; }
}
现在,我们需要这样的映射:
<id name="ItemSaleCode" column="SaleCode" type="String" generator="assigned" />
<one-to-one name="SaleParent" class="ItemSale"
constrained="true" property-ref="SaleCode" />
...
...
在流利中应该是这样的:
public ItemSaleDetailMap()
{
...
Id(x => x.ItemSaleCode)
.CustomType<String>()
.Column("SaleCode")
.GeneratedBy.Assigned();
HasOne(x => x.SaleParent)
.ProeprtyRef("SaleCode")
.Constrained();
}
public ItemSaleMap()
{
References(x => x.SaleDetail)
.Column("SaleCode")
.Unique()
.Cascade.All();
Map(x => x.SaleCode)
.Column("SaleCode")
.Not.Update()
.Not.Insert()
}
但同样,代理 INT 或长密钥是我肯定会走的路......