1

Fluent で mappins を設定する方法がわかりません :(

これが私の状況です: Element オブジェクトがあり、(理論的には) Search オブジェクトと 1 対 1 の関係を持つ必要があります。ただし、検索オブジェクトはそれ自体と 1 対多の関係を持つ必要があります。つまり、Element オブジェクトは最大で 1 つの Search オブジェクトを持つことができ (何も持たないこともできます)、Search オブジェクトは他の Search オブジェクトのコレクションを持ちます。

次のマッピングから始めました。彼らは私が期待した正しい DB モデルを作成し、問題なく保存できます。データを取得するときに問題が発生します...

public class ElementMap : ClassMap< Element >
{
    public ElementMap()
    {
        Schema( "dbo" );
        Table( "Element" );
        LazyLoad();
        Id( x => x.Id )
            .Column( "Id" )
            .CustomType( "Int32" )
            .Access.Property()
            .CustomSqlType( "int" )
            .Not.Nullable()
            .UnsavedValue( 0 )
            .GeneratedBy.Identity();
        HasOne( x => x.Search )
            .Cascade.All()
            .Not.LazyLoad();
    }
}

public class SearchMap : ClassMap< Search >
{
    public SearchMap()
    {
        Schema( "dbo" );
        Table( "Search" );
        LazyLoad();
        Id( x => x.Id )
            .Column( "Id" )
            .CustomType( "Int32" )
            .Access.Property()
            .CustomSqlType( "int" )
            .Not.Nullable()
            .UnsavedValue( 0 )
            .GeneratedBy.Identity();
        ReferencesAny( x => x.Parent )
            .IdentityType< int >()
            .MetaType< string >()
            .EntityTypeColumn( "ParentType" )
            .EntityIdentifierColumn( "ParentId" )
            .AddMetaValue< Element >( "E" )
            .AddMetaValue< Search >( "S" );
        HasMany( x => x.Searches )
            .Table( "Search" )
            .KeyColumn( "ParentId" )
            .Where( "ParentType = 'S'" )
            .Cascade.All()
            .LazyLoad();
    }
}

前述のように、モデルは正しく見えます。Element テーブルには ID 用の列が 1 つ含まれ、Search テーブルには ID 列が含まれます。ParentType 列は、親が Element オブジェクトの場合は "E" に設定され、 parent は Search オブジェクトであり、最後に親の ID を参照する ParentId です。

どういうわけかそれは問題ないようで、理にかなっています(少なくとも私には:P)。

データベース内のデータのサンプルを次に示します。

Element table
Id
-----------
1
2

Search table
Id          ParentType ParentId
----------- ---------- -----------
1           E          1
2           S          1
3           E          2
4           S          3
5           S          3

ここで、最初の Element オブジェクトには 1 つの Search オブジェクトを含む Search オブジェクトが含まれ、2 番目の Element オブジェクトには 2 つの検索オブジェクトを含む Search オブジェクトが含まれます。

ここでの問題は、データを取得するときに、最初の Element オブジェクトは正しいが、2 番目のオブジェクトが正しくないことです。その検索オブジェクトの ID は 2 ですが、実際には 3 である必要があります (データベースで親が E としてマークされている 2 番目の検索オブジェクトの ID)。

私の推測では、Search オブジェクトに対して行ったように、何らかの方法で .Where( "ParentType = 'E'" ) を Element オブジェクトのマッピングに追加する必要がありますが、HasOne() メソッドには .Where() メソッドがありません (通常は意味がないからです)。だから私は本当にそれを指定する方法がわかりません... :(

問題は常に説明するのが非常に難しいので、これが十分に明確であることを願っています:)これは私にとって非常に重要なプロジェクトであるため、どんな助けも大歓迎です:(

皆さんありがとう!

セブ:)

4

1 に答える 1

1

HasOne は ReferenceAny の Any 部分を考慮しないため、ここではまったく使用できません。私が見る唯一のオプションは、検索のプライベートコレクションを適切な場所にマップParentType = 'E'し、プロパティの参照への変換を処理することSearchです。

于 2012-08-14T06:30:08.537 に答える