无法确定下表的正确映射。
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,我们如何在我的实体中拥有此属性。因为不允许对单个列进行多次映射。
答案 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键是我肯定要去的方式......