2011-01-20 14 views
3

私は2つのテーブルを持っています。私は、各ユーザーがどの项目にもフラグを立てることができるようにしたい。明示的なIDを持たない単純な関係を格納する

ここでは、集合論的観点から、これをユーザーとアイテムの単純な関係として保存するのが妥当であるはずです。この新しいテーブルUserItemFlagsを呼び出します。テーブルには2つの列があります。 1つはUserテーブルへの外部キー、もう1つはItemテーブルへの外部キーです。ユーザーUがアイテムIにフラグを付けると、これはUserItemFlagsテーブルの行(U, I)の存在によって表されます。

Fluent-NHibernateでこれを表現する際の私の問題は次のとおりです。Idマッピングをどうすればいいのか分かりません。理想的には、ユーザーとアイテムの間にこの関係が存在するかどうかよりも何もないため、IDはありません。このモデルの自然な結果は、テーブルに重複する行を持つことは不可能だということです。これは望ましい機能です。

using FluentNHibernate.Mapping; 

public class UserItemFlagsMapping : ClassMap<UserItemFlags> 
{ 
    public UserItemFlagsMapping() 
    { 
     // Aaaa! I must have an Id! 
     References(x => x.User).Not.Nullable(); 
     References(x => x.Item).Not.Nullable(); 
    } 
} 

この特定のケースではFluentを放棄する必要がある場合でも、正しい方向のポインタがあればうれしいです。

答えて

2

あなたがIDを持っていないとはどういう意味ですか?ユーザーIDとアイテムIDの両方のコンポジットIDがあります。


編集:答えはこのコメントである:

ID()メソッドは、単一の列主キーのためのものです。代わりにCompositeId()を使用します。 KeyReference(x => x.Item、 "item_id";もちろん、デフォルトのコンベンションマッピングを使用している場合は、

+0

Fluent-NHibernateは同意しないFluentが理解できるように、 'ClassMap <...>'の 'Id'メソッドを呼び出す必要があります。 –

+2

Id()メソッドは、単一列の主キーのみを対象としています。 KeyReference(x => x.Item、 "item_id";もちろん、もしあなたがCompositeId()を使っていたら、CompositeId()デフォルトのコンベンションマッピングを使用しています列名が必要です。 – Rich

1

私はまだ使用していません。流暢NHibernateですが、標準NHibernateで通常私はこのようなテーブルを直接マップしません。

多対多のテーブルは、関係の2つの側にコレクションとして作成されます。 だから、必要があります:コレクションに要素を追加する

User.ItemsとItem.Users

は、マッピングテーブルUserItemFlags内の行を作成します。

も参照してください: http://marekblotny.blogspot.com/2009/02/fluent-nhbernate-and-collections.html

ダヴィデ

+0

ああ、十分ですが、データを使用する方法と一致しないため、これらのクラスでリストを使用しないようにしたいと考えています。 –

関連する問題