我正在使用NHibernate 3.3和FluentNHibernate 1.3。
我的数据库有两个表: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);
....
}
我不知道如何使这项工作,因为详细信息行没有InvTimeID键。我得到了:
NHibernate.Cfg.Configuration - 外键(FKAD4039AB666D3F7:tInvoiceDetail [DWInvoiceID]))必须与引用的主键具有相同的列数(tInvoiceHeader [DWInvoiceID,InvTimeID]) NHibernate.FKUnmatchingColumnsException:外键(FKAD4039AB666D3F7:tInvoiceDetail [DWInvoiceID]))必须与引用的主键具有相同的列数(tInvoiceHeader [DWInvoiceID,InvTimeID]) at NHibernate.Mapping.ForeignKey.AlignColumns(Table referencedTable) 在NHibernate.Mapping.ForeignKey.AlignColumns() 在NHibernate.Cfg.Configuration.SecondPassCompileForeignKeys(表格,ISet完成) NHibernate.Cfg.Configuration - 外键(FKAD4039AB666D3F7:tInvoiceDetail [DWInvoiceID]))必须与引用的主键具有相同的列数(tInvoiceHeader [DWInvoiceID,InvTimeID]) NHibernate.FKUnmatchingColumnsException:外键(FKAD4039AB666D3F7:tInvoiceDetail [DWInvoiceID]))必须与引用的主键具有相同的列数(tInvoiceHeader [DWInvoiceID,InvTimeID]) at NHibernate.Mapping.ForeignKey.AlignColumns(Table referencedTable) 在NHibernate.Mapping.ForeignKey.AlignColumns() 在NHibernate.Cfg.Configuration.SecondPassCompileForeignKeys(表格,ISet完成)
这可以吗?我的查询将始终从标题到详细信息,而不是相反。我无法修改表格。
答案 0 :(得分:0)
升级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");
}