Fluent nhibernate Fluent-在标识上与一个子项的关系,在复合键上与另一个子项的关系
因此,我有一个Fluent nhibernate Fluent-在标识上与一个子项的关系,在复合键上与另一个子项的关系,fluent-nhibernate,composite-key,fluent-nhibernate-mapping,Fluent Nhibernate,Composite Key,Fluent Nhibernate Mapping,因此,我有一个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; } pub
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 InvoicePayment
{
public virtual long InvoicePaymentId { get; set; }
public virtual Invoice Invoice{ get; set; }
}
问题是,在我的InvoicePayment
的基础架构中,我有InvoiceNumber
,SiteId
(到站点
对象)和CustomerId
(到客户
对象)
在InvoiceLineItem中,我将InvoiceId链接回发票
因此,我的发票映射如下所示:
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();
}
}
公共密封类发票映射:类映射
{
公共发票地图()
{
表(“发票视图”);
Id(x=>x.InvoiceId).GeneratedBy.Identity();
映射(x=>x.InvoiceNumber);
参考文献(x=>x.Site,“SiteId”);
参考(x=>x.客户,“客户ID”);
HasMany(x=>x.LineItems)
.Inverse();
HasMany(x=>x.Transactions)
.KeyColumns.Add(“站点ID”)
.KeyColumns.Add(“EPayCustomerId”)
.KeyColumns.Add(“发票编号”)
.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");
}
}
公共类InvoiceLineItemMap:ClassMap
{
公共发票LineItemMap()
{
表(“发票行项目”);
Id(x=>x.InvoiceLineItemId).GeneratedBy.Identity();
参考文件(x=>x.发票,“发票ID”);
}
}
最后是我的发票付款映射
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();
}
}
公共类InvoicePaymentMap:ClassMap
{
公共发票支付地图()
{
表(“发票付款”);
Id(x=>x.InvoicePaymentId).GeneratedBy.Identity();
复合ID()
.KeyProperty(x=>x.Site,“SiteId”)
.KeyProperty(x=>x.Customer,“CustomerId”)
.KeyProperty(x=>x.InvoiceNumber);
参考文献(x=>x.Site,“SiteId”);
参考(x=>x.客户,“客户ID”);
参考(x=>x.Invoice)
.列(“站点ID”、“客户ID”、“发票编号”)
.Nullable();
}
}
所以,事实上,我得到了一个错误
外键(FKE9F746C567E71B3F:InvoiceLineItems[InvoiceId])必须与引用的主键(InvoiceView[SiteId,CustomerId,InvoiceNumber])具有相同的列数
如何调整映射,以便在复合id上加入发票付款和标识列上的行项目?错误消息看起来有点奇怪。我希望
InvoiceMap
中的CompositeId()…
会产生此错误
错误源于这样一个事实,即每个实体只能有一个Id,对CompositeId的调用将覆盖对Id的上一个调用,因此发票的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();
}
}
公共类发票
{
公共虚拟长发票ID{get;set;}
公共虚拟发票标识{get;set;}
公共虚拟IList行项目{get;set;}
公共虚拟IList事务{get;set;}
}
公共类发票标识
{
公共虚拟字符串InvoiceNumber{get;private set;}
公共虚拟客户客户{get;private set;}
公共虚拟站点站点{get;private set;}
公共标识(字符串发票编号、客户、站点)
{
发票编号=发票编号;
客户=客户;
地点=地点;
}
}
公共密封类InvoiceMap:ClassMap
{
公共发票地图()
{
表(“发票视图”);
Id(x=>x.InvoiceId).GeneratedBy.Identity();
组件(x=>x.Identity,c=>
{
c、 映射(x=>x.InvoiceNumber);
c、 参考文献(x=>x.Site,“SiteId”);
c、 参考(x=>x.客户,“客户ID”);
});
HasMany(x=>x.LineItems)
.Inverse();
HasMany(x=>x.Transactions)
.PropertyRef(i=>i.Identity)
.KeyColumns.Add(“站点ID”、“EPayCustomerId”、“发票编号”)
.Inverse();
}
}
公共类InvoicePaymentMap:ClassMap
{
公共发票支付地图()
{
表(“发票付款”);
Id(x=>x.InvoicePaymentId).GeneratedBy.Identity();
参考(x=>x.Invoice)
.列(“站点ID”、“客户ID”、“发票编号”)
.PropertyRef(i=>i.Identity)
.Nullable();
}
}
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();
}
}