2013-02-28 61 views
0

我使用NHibernate 3.3與FluentNHibernate 1.3。nhibernate外鍵必須與引用主鍵具有相同的列數

我的數據庫有兩個表: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])具有相同數量的列NHibernate.Mapping .ForeignKey.AlignColumns() at NHibernate.Cfg.Configuration.SecondPassCompileForeignKeys(Table table,ISet done) NHibernate.Cfg.Configuration - Foreig n鍵(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.SecondPassCompileForeignKeys(列表的表,ISet完成)

可以工作嗎?我的查詢將始終從頭到尾,而不是相反。我無法修改表格。

+2

如果兩張發票可以有相同的發票編號,這怎麼可能工作?不只是與NHibernate,但在所有? – hvd 2013-02-28 19:44:17

+0

標題有一個組合鍵。詳細信息行有其自己的密鑰。兩個標頭可以具有相同的DWInvoiceID,但它們必須具有不同的InvTimeID。 – Amy 2013-02-28 19:47:02

+1

什麼hvd說。當父表具有複合主鍵並且子表缺少組成該鍵的一個或多個列時,無法在兩個表之間建立聲明性fk關係。重構InvoiceHeader表。 – Tim 2013-02-28 19:56:04

回答

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"); 
    } 
相關問題