C# nhibernate外键必须与引用的主键具有相同的列数
我将NHibernate 3.3与FluentNHibernate 1.3一起使用C# nhibernate外键必须与引用的主键具有相同的列数,c#,sql-server-2005,nhibernate,fluent-nhibernate,C#,Sql Server 2005,Nhibernate,Fluent Nhibernate,我将NHibernate 3.3与FluentNHibernate 1.3一起使用 我的数据库有两个表:InvoiceHeader和InvoiceDetail。标头有一个由两列组成的复合键。详细信息有一个单列主键。问题是,该细节不包含组合键的两个部分;它只有一部分。不存在外键约束 public class TInvoiceHeader { public virtual TInvoiceHeaderIdentifier Identifier { get; set; } publi
我的数据库有两个表:InvoiceHeader和InvoiceDetail。标头有一个由两列组成的复合键。详细信息有一个单列主键。问题是,该细节不包含组合键的两个部分;它只有一部分。不存在外键约束
public class TInvoiceHeader
{
public virtual TInvoiceHeaderIdentifier Identifier { get; set; }
public virtual long Dwinvoiceid { get; set; }
public virtual int InvTimeID { get; set; }
public virtual IList<TInvoiceDetail> Details { get; set; }
....
}
public class TInvoiceHeaderIdentifier
{
public virtual long Dwinvoiceid { get; set; }
public virtual int InvTimeID { get; set; }
....
}
public TInvoiceHeaderMap()
{
CompositeId<TInvoiceHeaderIdentifier>(x => x.Identifier)
.KeyProperty(x => x.Dwinvoiceid, "DWInvoiceID")
.KeyProperty(x => x.InvTimeID, "InvTimeID");
HasMany<TInvoiceDetail>(x => x.Details).KeyColumn("DWInvoiceID");
....
}
public class TInvoiceDetail
{
public virtual TInvoiceHeader Header { get; set; }
public virtual long Dwinvoicedetailid { get; set; }
public virtual long Dwinvoiceid { get; set; }
....
}
public TInvoiceDetailMap()
{
Table("tInvoiceDetail");
LazyLoad();
Id(x => x.Dwinvoicedetailid).GeneratedBy.Identity().Column("DWInvoiceDetailId");
References<TInvoiceHeader>(x => x.Dwinvoiceid);
....
}
公共类TInvoiceHeader
{
公共虚拟TInvoiceHeaderIdentifier标识符{get;set;}
公共虚拟长语音ID{get;set;}
公共虚拟int InvTimeID{get;set;}
公共虚拟IList详细信息{get;set;}
....
}
公共类TInvoiceHeaderIdentifier
{
公共虚拟长语音ID{get;set;}
公共虚拟int InvTimeID{get;set;}
....
}
公共图书馆
{
CompositeId(x=>x.Identifier)
.KeyProperty(x=>x.Dwinvoiceid,“Dwinvoiceid”)
.KeyProperty(x=>x.InvTimeID,“InvTimeID”);
HasMany(x=>x.Details);
....
}
公共类详细信息
{
公共虚拟TInvoiceHeader头{get;set;}
公共虚拟详细信息ID{get;set;}
公共虚拟长语音ID{get;set;}
....
}
公共TInvoiceDetailMap()
{
表(“详细信息”);
懒散的负荷();
Id(x=>x.Dwinvoicedetailid).GeneratedBy.Identity()列(“Dwinvoicedetailid”);
参考(x=>x.id);
....
}
我不知道如何进行此操作,因为详细信息行没有InvTimeID键。我得到:
NHibernate.Cfg.Configuration-外键(FKAD4039AB666D3F7:tInvoiceDetail[DWInvoiceID])必须与引用的主键(tInvoiceHeader[DWInvoiceID,InvTimeID])具有相同的列数
NHibernate.FKUnmatchingColumnsException:外键(FKAD4039AB666D3F7:tInvoiceDetail[DWInvoiceID])必须与引用的主键(tInvoiceHeader[DWInvoiceID,InvTimeID])具有相同的列数
位于NHibernate.Mapping.ForeignKey.AlignColumns(表referencedTable)
在NHibernate.Mapping.ForeignKey.AlignColumns()处
在NHibernate.Cfg.Configuration.SecondPassCompileForeKeys(表表,ISet done)
NHibernate.Cfg.Configuration-外键(FKAD4039AB666D3F7:tInvoiceDetail[DWInvoiceID])必须与引用的主键(tInvoiceHeader[DWInvoiceID,InvTimeID])具有相同的列数
NHibernate.FKUnmatchingColumnsException:外键(FKAD4039AB666D3F7:tInvoiceDetail[DWInvoiceID])必须与引用的主键(tInvoiceHeader[DWInvoiceID,InvTimeID])具有相同的列数
位于NHibernate.Mapping.ForeignKey.AlignColumns(表referencedTable)
在NHibernate.Mapping.ForeignKey.AlignColumns()处
在NHibernate.Cfg.Configuration.SecondPassCompileForeKeys(表表,ISet done)
这行吗?我的查询总是从标题到细节,而不是从标题到细节。我无法修改这些表。升级nHibernate和Fluent nHibernate后,我遇到了这个问题。看起来它和列名混淆了 解决方案是手动命名我的列,问题就消失了
public void Override(AutoMapping<Record> mapping)
{
mapping.Id(x => x.Id).Column("RecordId");
mapping.Map(x => x.Name).Not.Nullable();
mapping.References(x => x.Parent).Not.Nullable().Column("ParentRecordId");
mapping.References(x => x.Type).Not.Nullable().Column("TypeId");
}
public void覆盖(自动映射)
{
mapping.Id(x=>x.Id).Column(“RecordId”);
mapping.Map(x=>x.Name).Not.Nullable();
mapping.References(x=>x.Parent).Not.Nullable().Column(“ParentRecordId”);
mapping.References(x=>x.Type).Not.Nullable().Column(“TypeId”);
}
如果两张发票可以具有相同的发票ID,这怎么可能起作用?不仅仅是NHibernate,还有所有的?头部有一个复合键。“详细信息”行有自己的键。两个头可以具有相同的VoiceID,但它们必须具有不同的InvTimeID。hvd是这么说的。当父表具有复合主键且子表缺少组成该键的一个或多个列时,无法在两个表之间建立声明性fk关系。重构InvoiceHeader表。@Amy但是如果两张发票都有发票ID 1,您如何确定哪些明细行属于第一张发票,哪些属于第二张发票?@Amy,您的InvoiceHeader表设计很古怪。