所以,我有一个Invoice
对象,如此:
public class Invoice
{
public virtual long InvoiceId { get; set; }
public virtual string InvoiceNumber{ get; set; }
public virtual Customer Customer { get; set; }
public virtual Site Site { get; set; }
public virtual IList<InvoiceLineItem> LineItems { get; set; }
public virtual IList<InvoicePayment> Transactions { get; set; }
}
然后,我有一个像这样的发票行项目
public class InvoiceLineItem
{
public virtual long InvoiceLineItemId { get; set; }
public virtual Invoice Invoice{ get; set; }
}
最后,发票付款
public class InvoicePayment
{
public virtual long InvoicePaymentId { get; set; }
public virtual Invoice Invoice{ get; set; }
}
问题在于,在InvoicePayment
的基础架构中,我有InvoiceNumber
,SiteId
(Site
对象)和CustomerId
(到Customer
对象)。
在InvoiceLineItem中,我将InvoiceId链接回Invoice
。
所以,我对Invoice的映射看起来像这样:
public sealed class InvoiceMap : ClassMap<Invoice>
{
public InvoiceMap()
{
Table("InvoiceView");
Id(x => x.InvoiceId).GeneratedBy.Identity();
Map(x => x.InvoiceNumber);
References<Site>(x => x.Site, "SiteId");
References<Customer>(x => x.Customer, "CustomerId");
HasMany<InvoiceLineItem>(x => x.LineItems)
.Inverse();
HasMany<InvoicePayment>(x => x.Transactions)
.KeyColumns.Add("SiteId")
.KeyColumns.Add("EPayCustomerId")
.KeyColumns.Add("InvoiceNumber")
.Inverse();
}
}
订单项映射
public class InvoiceLineItemMap : ClassMap<InvoiceLineItem>
{
public InvoiceLineItemMap()
{
Table("InvoiceLineItems");
Id(x => x.InvoiceLineItemId).GeneratedBy.Identity();
References<FTNI.Core.Model.Invoice.Invoice>(x => x.Invoice, "InvoiceId");
}
}
最后是我的发票付款映射
public class InvoicePaymentMap : ClassMap<InvoicePayment>
{
public InvoicePaymentMap()
{
Table("InvoicePayments");
Id(x => x.InvoicePaymentId).GeneratedBy.Identity();
CompositeId()
.KeyProperty(x => x.Site, "SiteId")
.KeyProperty(x => x.Customer, "CustomerId")
.KeyProperty(x => x.InvoiceNumber);
References<Site>(x => x.Site, "SiteId");
References<EPayCustomer>(x => x.Customer, "CustomerId");
References<FTNI.Core.Model.Invoice.Invoice>(x => x.Invoice)
.Columns("SiteId", "CustomerId", "InvoiceNumber")
.Nullable();
}
}
所以,实际上,我收到了一个错误
外键(FKE9F746C567E71B3F:InvoiceLineItems [InvoiceId]))必须与引用的主键具有相同的列数(InvoiceView [SiteId,CustomerId,InvoiceNumber])
如何调整我的映射,以便加入复合ID和标识列上的订单项的发票付款?
答案 0 :(得分:1)
错误消息看起来有点奇怪。我希望CompositeId()...
中的InvoiceMap
产生此错误。
错误源于这样一个事实,即每个实体只能有1个Id,而对CompositeId的调用会覆盖之前对Id的调用,因此Invoice的Id是CompositeId,InvoiceLineItem中的单个列不匹配。
尝试以下方法:
public class Invoice
{
public virtual long InvoiceId { get; set; }
public virtual InvoiceIdentity Identity { get; set; }
public virtual IList<InvoiceLineItem> LineItems { get; set; }
public virtual IList<InvoicePayment> Transactions { get; set; }
}
public class InvoiceIdentity
{
public virtual string InvoiceNumber{ get; private set; }
public virtual Customer Customer { get; private set; }
public virtual Site Site { get; private set; }
public Identity(string invoicenumber, Customer customer, Site site)
{
InvoiceNumber = invoicenumber;
Customer = customer;
Site = site;
}
}
public sealed class InvoiceMap : ClassMap<Invoice>
{
public InvoiceMap()
{
Table("InvoiceView");
Id(x => x.InvoiceId).GeneratedBy.Identity();
Component(x => x.Identity, c =>
{
c.Map(x => x.InvoiceNumber);
c.References(x => x.Site, "SiteId");
c.References(x => x.Customer, "CustomerId");
});
HasMany(x => x.LineItems)
.Inverse();
HasMany(x => x.Transactions)
.PropertyRef(i => i.Identity)
.KeyColumns.Add("SiteId", "EPayCustomerId", "InvoiceNumber")
.Inverse();
}
}
public class InvoicePaymentMap : ClassMap<InvoicePayment>
{
public InvoicePaymentMap()
{
Table("InvoicePayments");
Id(x => x.InvoicePaymentId).GeneratedBy.Identity();
References(x => x.Invoice)
.Columns("SiteId", "CustomerId", "InvoiceNumber")
.PropertyRef(i => i.Identity)
.Nullable();
}
}