2009-09-02 10 views
0

私はおおよそ次のように見ている私のデータベース内のテーブルを持っている:NHibernateの "グループ名"列からグループエンティティクラスをマッピングするには?

create table Foo (
    Id    int identity  not null, 
    Name   varchar(100)  not null, 
    GroupName  varchar(100)  not null, 
    constraint PK_Foo primary key (Id) 
) 

今、私はこのような2つのエンティティクラスにこのテーブルをマッピングする:

class Foo { 
    public virtual in Id { get; private set; } 
    public virtual string Name { get; set; } 
    public virtual Group Group { get; set; } 
} 

class FooGroup { 
    public virtual string Name { get; set; } 
    public virtual ISet<Foo> Foos { get; private set; } 
} 

はNHibernateの持つ可能性、このですか?私はネットとNHのドキュメントを検索しようとしましたが、何を探したらいいのか分かりません。検索クエリのアイデアは高く評価されます。

カスタムHQL/SQLクエリを使用して個別のグループ名を選択し、別のカスタムクエリを使用して適切なセットのアイテムを選択するFooGroupのマッピングを作成することはできますか?

+0

あなたは何を達成しようとしているのですか、なぜ2つのクラスが必要ですか? – epitka

+0

データモデルがもともと設計されていたとき、グループ名は名前にすぎませんでした。後で、物事が進化するにつれて、実際のグループには現在、遵守するビジネスルールがあるように見えます。例:FooGroupには、魔法のビジネス集約関数を含まれているFoosに適用し、整数を返すメソッドBar()が必要です。これをDDDのやり方でやってみると、文字列 'GroupNameをFooGroupクラスにリファクタリングし、ここでメソッドを宣言できるとわかりました。これは理にかなっていますか? –

+0

私の質問と似たような音 Firo

答えて

0

私はそれはあなたがNHibernateのマッピングで純粋にやりたいことができないと思う...それはからの直接的なマッピングを定義するために非常に簡単です大藤私は

:-)他の誰かによって間違って証明することができるがその後、

class RawFooData 
{ 
    public virtual in Id { get; private set; } 
    public virtual string Name { get; set; } 
    public virtual string GroupName { get; set; } 
} 

して、必要な値を取得するには、この処理:へのあなたのテーブル

IEnumerable<FooGroup> groups = allRawFooData.Select(data => data.GroupName) 
             .Distinct() 
             .Select(name => new FooGroup() 
                 { 
                  Name = name 
                 }); 

foreach(var group in groups) 
{ 
    group.Foos = allRawFooData.Where(data => data.GroupName == group.Name); 
} 

私はあなたがデている場合は、ここでしかパフォーマンスの問題を発見すると思います大量のデータ(例: 10K行以上)。

+0

これはまさに私が今持っているものです。なぜ、私がグループ化クラスを導入したいのかについてのエピカのコメントに対する私の返答を見てください。 –

関連する問題