无法找出下表的正确映射。
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/