2012-05-24 20 views
2

我有一組來自,我想在NHibernate的使用一個TPC繼承了不同來源的支付對象。所有這些對象的基礎都是支付處理器(因此它們都具有一致的格式),但是在數據庫中沒有基類的表示。我想,我有我的映射制定出來的,不同的是我得到試圖插入時拋出的異常的事實 - 「不能使用標識列密鑰生成與<工會子>映射:<實體名稱>」表每有FluentNHibernate類繼承 - 身份生成

類:

public class BasePayment 
{ 
    public virtual int Id { get; set; } 
    public virtual PaymentSource Source { get; set; } 
    public virtual DateTime Date { get; set; } 
    public virtual decimal Amount { get; set; } 
} 

public class SubPayment : BasePayment 
{ 
} 

映射:

public class BasePaymentMap : ClassMap<BasePayment> 
{ 
    public BasePaymentMap() 
    { 
     UseUnionSubclassForInheritanceMapping(); 
     DiscriminateSubClassesOnColumn("Source"); 
     Id(m => m.Id); 
     Map(m => m.Source); 
     Map(m => m.Amount); 
     Map(m => m.Date); 
    } 
} 

public class SubPaymentMap : SubclassMap<SubPayment> 
{ 
    public SubPaymentMap() 
    { 
     DiscriminatorValue(PaymentSource.SourceX); 
     Abstract(); 
     Table("SourceXPayments"); 
    } 
} 

這就是據我已經得到了。在一個SaveOrUpdate,我收到上述錯誤,和谷歌搜索沒有證明有幫助迄今 - 我發現這樣一個問題:Cannot use identity column key generation with <union-subclass> (TABLE_PER_CLASS)這似乎覆蓋的Java/Hibernate的問題,但我有與轉換問題在@GeneratedValue(strategy = GenerationType.TABLE)成流利的語法,流利的NHibernate的GeneratedBy()方法似乎並不有一個表,或大量的文檔資料(我發現)爲在幕後它做什麼。

做了一些更多的閱讀周圍似乎這可能是不可能的,所以如果任何人都可以證實這一點或爲情況提供解決辦法,將不勝感激。

如果我沒有給予足夠的細節,請讓我知道什麼是更多的使用。

在此先感謝

回答

6
UseUnionSubclassForInheritanceMapping(); 
DiscriminateSubClassesOnColumn("Source"); 

是相互矛盾和FNH會忽略一個。

UseUnionSubclassForInheritanceMapping意味着每個類都有它自己的表中的所有列和表是用來區分階級,沒有列需要

DiscriminateSubClassesOnColumn意味着每一個類繼承層次的生活在同一個表中,並使用的列區分類。

錯誤信息意味着當使用UseUnionSubclassForInheritanceMapping身份生成是不允許的,因爲id對於一個表是唯一的,但NHibernate威脅所有子類作爲一個ID,其中ID必須是唯一的。

例如session.Get<BaseClass>(5);不會relyably工作了,因爲可能有不止一個子類具有相同ID。

@GeneratedValue(strategy = GenerationType.TABLE)只是告訴「使用另一種策略而不是身份」。 GeneratedBy.HiLow();將是一個很好的選擇身份。

+0

感謝FIRO - 你已經證實了我在讀我張貼後。雖然我明白爲什麼它不會讓我這樣做,但從我的角度來看,這是一個煩惱,因爲這意味着我必須渾濁我的桌子或物體才能使它合適。我現在正在尋找不同的解決方案,但非常感謝,這回答了原來的問題。 –

+0

@Ian你是怎麼解決這個問題的?我也不想在我的課堂上製造太多的東西。 –

+0

@FrancoisBotha解決的辦法是踢'DiscriminateSubClassesOnColumn(「Source」);'並使用另一個Id生成器。 'GeneratedBy()。HighLow(maxLowValue)'將是我的\t建議,其中maxLowValue將介於100和10000之間 – Firo