0

我試圖創建一個如何引用具有2列複合類的CompositeId具有2列複合類的FluentNhibernate?

public class BaseMap<T> : ClassMap<T> 

我的應用程序。它應該支持本地化的實體,它們的主鍵必須是兩個編號&語言:

CompositeId() 
    .KeyProperty(x => x.Id) 
    .KeyProperty(x => ((ILocalizedEntity)x).Language); 

我想另一件事是一個局部類能夠引用另一個局部類。

我已經做了以下的(大量的研究後,這是我的全部):

public new ManyToOnePart<TOther> References<TOther>(Expression<Func<T, TOther>> memberExpression) where TOther : BaseEntity 
    { 
     if (typeof(ILocalizedEntity).IsAssignableFrom(typeof(TOther))) 
     { 
      return base.References(memberExpression) 
       .Columns("CategoryId") 
       .Columns("Language"); 
     } 

     return base.References(memberExpression); 
    } 

這給了我嘗試插入時IndexOutOfRange例外,原因是「語言」屬性被映射了兩次,但只有1中的DB語言欄,所以我這樣做:

public new ManyToOnePart<TOther> References<TOther>(Expression<Func<T, TOther>> memberExpression) where TOther : BaseEntity 
    { 
     if (typeof(ILocalizedEntity).IsAssignableFrom(typeof(TOther))) 
     { 
      return base.References(memberExpression) 
       .Columns("CategoryId") 
       .Columns("Language") 
       .Not.Update() 
       .Not.Insert(); 
     } 

     return base.References(memberExpression); 
    } 

從而解決了IndexOutOfRange問​​題,但並沒有完成我想要的。因爲它總是向列「CategoryId」插入NULL,因爲我指定了Not.Insert()和Not.Update(),所以它不會!

現在,我希望它映射「CategoryId」而不是「Language」,因爲它已經被映射,因爲它是ComposideId(主鍵)的一部分。

所以我給一個嘗試這樣的:

public new ManyToOnePart<TOther> References<TOther>(Expression<Func<T, TOther>> memberExpression) where TOther : BaseEntity 
    { 
     if (typeof(ILocalizedEntity).IsAssignableFrom(typeof(TOther))) 
     { 
      return base.References(memberExpression) 
       .Columns("CategoryId") 
       .Nullable() 
       .Columns("Language") 
       .Not.Update() 
       .Not.Insert(); 
     } 

     return base.References(memberExpression); 
    } 

Whishing不會插入或更新只是「語言」,而不是「類別ID」 - 但沒有運氣無論是。

我也試圖讓語言首先在PK:

  CompositeId() 
       .KeyProperty(x => ((ILocalizedEntity)x).Language) 
       .KeyProperty(x => x.Id); 

,改變了參考:

  return base.References(memberExpression) 
       .Columns("Language") 
       .Not.Update() 
       .Not.Insert() 
       .Columns("CategoryId") 
       .Nullable(); 

但仍是 「Not.Insert()」,「不.Update()「影響」語言「&」CategoryId「。

我嘗試了 「參考」 調用之前映射 「的CategoryId」,像這樣:

  Map(memberExpression, "Language"); 
      return base.References(memberExpression) 
      ....... 

但失敗了。

任何人有任何想法,如何引用具有2列的類CompositeId從具有2列的類CompositeId當1列是主鍵和外鍵公用的?

+0

儘可能避免compositeIds。以下也避免重複http://stackoverflow.com/a/5431842/671619 – Firo 2012-02-14 12:26:53

+0

不過,如果我想使用它們,爲什麼它必須如此複雜?如果你想在程序和數據庫的體系結構中找到合適的東西,複合ID有時是最好的選擇......是不是? – 2012-02-16 20:41:31

回答

0

我有一個與compositeid的一部分作爲參考的類似問題,我無法通過谷歌解決它,所以也沒有在2周內自己嘗試解決它,因此不喜歡它們。

有些情況下CompositeId有它的位置,但在你描述的情況下很可能不是。一個簡單的字典和便利性屬性可以爲實際語言獲得價值要簡單得多,並避免重複每種語言的所有其他屬性。

+0

它們對所有語言都一樣嗎?我不知道....我試圖完成的是將本地化邏輯應用到每個新的實體......我只是希望它從一個接口繼承並讓魔法完成......如果它不是這個小的技術性限制。 – 2012-02-17 11:47:39

+1

的一些缺點:1)當你用id查詢時,你總是需要知道這個語言2)你總是必須爲每個查詢添加語言3)你必須自己管理這個id(不能使用4)Category.Color,Category.Type等將爲每種語言重複使用 – Firo 2012-02-17 11:59:38

+0

5)在程序中切換語言時,您必須重新加載實體6)實施故障恢復如果本地實體丟失意味着您必須再次查詢數據庫以獲取默認語言實體,而不是在字典中使用默認語言實體 – Firo 2012-02-17 13:37:22