使用非主键的流利休眠一对一映射

本文关键字:利休 休眠 一对一 映射 | 更新日期: 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 或长密钥是我肯定会走的路......