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() メソッドがありません (通常は意味がないからです)。だから私は本当にそれを指定する方法がわかりません... :(
問題は常に説明するのが非常に難しいので、これが十分に明確であることを願っています:)これは私にとって非常に重要なプロジェクトであるため、どんな助けも大歓迎です:(
皆さんありがとう!
セブ:)