私は自分のアプリケーションのための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?
できるだけcompositeIdsを避けてください。次はまた重複を避けるhttp://stackoverflow.com/a/5431842/671619 – Firo
まだ、私はそれらを使用したい場合、それはなぜそんなに複雑でなければならないのですか?あなたが構造的にプログラムとdbで正しいものを考えるなら、複合IDは時には最良の選択です...そうではありませんか? –