c# - 流畅的 Nhibernate 一对一非主键映射

标签 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.

下面给出了实体及其映射。

商品促销

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>的getter了。 <强> 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()
}

但是,代理 INT 或 LONG 键是我肯定会选择的方式......

关于c# - 流畅的 Nhibernate 一对一非主键映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27702196/

相关文章:

mysql - 流畅的多对多关系不起作用

c# - 如何自动创建用户备份?

c# - 如何将 C# Select () 扩展委托(delegate)或表达式传递给存储库?

c# - 我如何从其路径获取文件输入流?

NHibernate:返回具有分页子集合的对象的最简单方法?

c# - 如何更改 Fluent NHibernate 中小数的默认比例和精度?

nhibernate - 如何在 Nhiberbate 中映射 oracle 数据类型 SYS.XMLTYPE

c# - 在没有对象属性的情况下在 Fluent NHibernate 中映射外键

c# - 如何从多个流畅的 NHibernate session 工厂获取结果?

c# - 我的正则表达式有问题吗?