使用非主键的流畅Nhibernate一对一映射

时间:2014-12-30 08:47:48

标签: c# nhibernate fluent-nhibernate nhibernate-mapping one-to-one

无法确定下表的正确映射。

  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.

实体及其映射如下所示。

ItemSale

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();
    }
}

ItemSaleDetail

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,我们如何在我的实体中拥有此属性。因为不允许对单个列进行多次映射。

1 个答案:

答案 0 :(得分:1)

好的,有了可分配的ID,我们就可以这样做。首先我们应该确定ID是已分配的,因此我们可以像这样调整<id> ItemSaleCode 的获取者:

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" />
...

    ...          

在Fluent中应该是这样的:

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()
}

但同样,Surrogate INT或LONG键是我肯定要去的方式......

相关问题