2

複数のクラスに値の型のリストがあるモデルがあります。

class Foo { public List<ValType> Vals; }
class Bar { public List<ValType> Vals; }

Foo と Bar は、両方にこれらの val が含まれていることを除けば、無関係です。ValTypes の追加、削除などのルールはクラスごとに異なります。このデザインをコードに残したいと思います。

たとえば、いくつかの Val を Foo から Bar にコピーしたい場合があります。データベースでは、各 ValType に独自のテーブルがあり、サイズを小さく軽量に保ち (親 ID + 2 つのフィールドのみ)、整合性チェックを可能にします。NHibernate が、オブジェクトをデータベースと同じくらい細かく保つべきだと言っていることは知っていますが、それは私のコードを醜くするだけです。

私がこれまでに考えた最善の方法は、ValType の個別のサブクラスを、親ごとに 1 つずつ作成することです。次に、そのレベルでそれらをマッピングできます。次に、追加ロジックと削除ロジックを接続して、適切なサブクラス間で自動変換し、適切なサブクラス タイプを持つプライベート リストにそれらを実際に格納します。しかし、これは少し複雑だったようです。

これをNHibernate(可能であればFluent NHibernate)でどのようにマッピングできますか?

これが重複している場合はお知らせください。これを検索する方法がよくわかりません。

4

2 に答える 2

3

データベース レベルでの解決策は次のとおりです。

Val(Id)
Bar(Id)
BarToVal(IdBar, IdVal)
FooToVal(IdFoo, IdVal) 

これらがどのようにマッピングされるかはよくわかりません。たぶん次のようなもの:

// BarMap:  
HasManyToMany(x => x.Vals).WithTableName("BarToVal");

// FooMap:  
HasManyToMany(x => x.Vals).WithTableName("FooToVal");

それが理にかなっていることを願っています...

于 2009-03-30T19:47:55.703 に答える
2

Fluent NHibernateの Google Code ページで例を見つけることができます。

モデル

public class Customer
{
    public string Name { get; set; }
    public string Address { get; set; }
}

スキーマ

table Customer (
    Id int primary key
    Name varchar(100)
)

table CustomerAddress (
    CustomerID int,
    Address varchar(100)
)

マッピング

public class CustomerMap : ClassMap<Customer>
{
    public CustomerMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);

        WithTable("CustomerAddress", m =>
        {
            m.Map(x => x.Address);
        });
    }
}

この例では、エンティティはデータベース内の 2 つのテーブルに分割されています。これらのテーブルは、キーで 1 対 1 で結合されます。WithTable 機能を使用すると、これら 2 つのテーブルを 1 つのエンティティとして扱うように NHibernate に指示できます。

于 2009-04-21T13:16:47.687 に答える