0

私は自分のアプリケーションのための2つのcolsを持つクラスを参照する方法2つのcolsを持つクラスのCompositeId FluentNhibernateのCompositeId?

public class BaseMap<T> : ClassMap<T> 

を作成しようとしています。

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

私がしたいもう一つは、別のローカライズされたクラスを参照できるようにするには1つのローカライズされたクラスである:それは彼らの主キーは、ID &言語の両方でなければなりませんローカライズされたエンティティをサポートする必要があります。私がやった

は、以下の(多くの研究の後、これは私が持っているすべてである):これは私に挿入しようとIndexOutOfRange例外を与えた

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); 
    } 

、その理由であることが確認された「言語」プロパティ二回マッピングされますが、DBで唯一の1言語列があったので、私はこれをしなかった:

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の問題を解決しますが、私が欲しいものを達成しませんでした。それはNot.Insert()とNot.Update()を指定したので、常にカラム "CategoryId"にNULLを挿入するため、そうではありません!

"CategoryId"はマップしたいが、 "Language"はマッピングされていないので、マップされているため、ComposideId(プライマリキー)の一部です。しかし、どちらかが運 - それは唯一の「言語」ではなく「区分」を挿入または更新されませんWhishing

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); 
    } 

は、だから私はこのようにしてくださいを与えました。

私も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()は "Language" & "CategoryId"の両方に影響します。

私はこのように、「参照」コールの前に「区分」をマッピングしてみました:

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

しかし、それは失敗しました。

誰もが2列のクラスから2列のCompositeIdを参照する方法はありますか?1列が主キーと外部キーに共通の場合、CompositeId?

+0

できるだけcompositeIdsを避けてください。次はまた重複を避けるhttp://stackoverflow.com/a/5431842/671619 – Firo

+0

まだ、私はそれらを使用したい場合、それはなぜそんなに複雑でなければならないのですか?あなたが構造的にプログラムとdbで正しいものを考えるなら、複合IDは時には最良の選択です...そうではありませんか? –

答えて

0

私はcompositeidの一部が参照となっている同様の問題がありました。私はgoogleとSOのどちらでも解決できず、2週間は自分で試してみることもできませんでした。

CompositeIdにはその場所がある場合がありますが、ほとんどの場合は説明していない場合があります。実際の言語の価値を得るための簡単な辞書と便利なプロパティは、はるかに簡単で、すべての言語で同じすべてのプロパティを複製することを避けます。

+0

本当にすべての言語で同じですか?私はうんざり....私が達成しようとしたのは、すべての新しいエンティティにローカライゼーションロジックを適用することです...私はちょうどそれがインターフェイスから継承し、魔法をやりましょう....その小さな専門的な制約.. –

+1

いくつかの短所:1)あなたは常にあなたがIDでクエリするときに言語を知る必要があります2)あなたは常に各クエリに言語を追加する必要があります3)あなたは自分でIDを管理する必要があります既存のidgenerators with compositeId)4)Category.Color、Category.Typeなどは各言語ごとに複製されます – Firo

+0

5)プログラム内で言語を切り替えるときにエンティティをリロードする必要があります。6)ローカライズされたエンティティが見つからない場合にフォールバックを実装する辞書にデフォルトを設定するのではなく、デフォルトの言語エンティティのデータベースを再度照会する必要があります – Firo

関連する問題