私は次のデータ構造を持っています:
+---------+
|Resume |
+---------+
|Id (PK) |
|IsActive |
|... |
|.. |
|. |
+---------+
+--------------------+
|Resume_Translation |
+--------------------+
|ResumeId (PK, FK) |
|Language (PK) |
|Title |
|Description |
|... |
|.. |
|. |
+--------------------+
したがって、2つの結合されたテーブルを使用してこのようなデータを取得できます。
+----------------------------------------------------------+
|Id | IsActive | ResumeId | Language | Title | Description |
+----------------------------------------------------------+
|1 | true | 1 | 'fr' | 'One' | 'One desc' |
|1 | true | 1 | 'pl' | 'Raz' | 'Raz Opis' |
|2 | true | 2 | 'fr' | 'B' | 'bla bla' |
|3 | true | 3 | 'fr' | 'C' | 'C bla bla' |
+----------------------------------------------------------+
Resume
私のドメインの観点から、私はエンティティのみを気にします。現在の翻訳を持つエンティティは1つしかないためResume
、コレクションを持つエンティティは必要ありません。Resume_Translations
Resume
public class Resume
{
public virtual int Id{ get; protected internal set; }
public virtual string Language { get; protected internal set; }
public virtual string Title { get; protected internal set; }
public virtual string Description { get; protected internal set; }
public virtual bool IsActive { get; protected internal set; }
}
FluentNHibernateを使用した現在のマッピングは次のとおりです。
public class ResumeMap : ClassMap<Resume>
{
public ResumeMap()
{
Table("Resume");
Id(x => x.Id);
Map(x => x.IsActive);
// other properties
Join("Resume_Translation", m =>
{
m.Fetch.Join();
m.Map(x => x.Language).Length(5);
m.Map(x => x.Title).Length(100);
m.Map(x => x.Description).Length(200);
});
}
}
WHERE述語に履歴書のIDと必要な言語を渡すだけで、問題なくリポジトリから必要なものを取得できます。
ただし、値の挿入と更新に問題があります。
私の質問は、NHibernateが現在のエンティティのレコードを更新するのではなく、Resume_Translationテーブルにのみ新しいレコードを挿入するマッピングをどのように定義するかです。
したがって、私が達成したいのは、データベースに次のレコードがある場合です。
|2 | true | 2 | 'fr' | 'B' | 'bla bla' |
結合はテーブル間の1対1の関係に適しているため、これをエンティティに取り込み、言語と翻訳を変更すると、nhibernateが更新を実行し、理解できます。異なる言語と翻訳で同じIDを持つ新しいエンティティを追加しようとすると、nhibernateはキーがすでに存在するというエラーを生成し、それも理解しています。
ですから、確かに私は間違った道を進んでいますが、誰かが私が望むマッピングを達成する方法について正しい解決策を教えてくれるなら、私は大いに感謝します。
別の質問ですが、ビジネスの観点から、エンティティとその翻訳をどのように処理しますか?
よろしくお願いします。
トーマス