我不知道如何使用 Fluent 配置我的映射 :(
这是我的情况:我有一个 Element 对象,它(理论上)应该与 Search 对象具有一对一的关系。但是,Search 对象应该与其自身具有一对多的关系。换句话说,一个 Element 对象最多可以有 1 个 Search 对象(也可以没有),而一个 Search 对象可以有其他 Search 对象的集合。
我从以下映射开始。他们创建了我期望的正确数据库模型并且可以很好地保存。检索数据时出现问题...
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 表包含 1 个 ID 列,Search 表包含一个 ID 列,如果父对象是 Element 对象,则 ParentType 列设置为“E”,如果parent 是一个 Search 对象,最后是一个 ParentId,它引用了 parent 的 ID。
不知何故,这似乎很好并且很有意义(至少对我来说: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
所以这里我的第一个元素对象包含一个包含 1 个搜索对象的搜索对象,第二个元素对象包含一个包含 2 个搜索对象的搜索对象。
现在的问题是,当我检索数据时,第一个 Element 对象是正确的,但第二个不是。它的 Search 对象的 ID 为 2,实际上它应该是 3(第二个 Search 对象的 ID,其父对象在数据库中标记为 E)。
我的猜测是我应该以某种方式将 .Where("ParentType = 'E'" ) 添加到 Element 对象映射中,就像我为 Search 对象所做的那样,但是 HasOne() 方法上没有 .Where() 方法(因为拥有一个通常没有意义)。所以我真的不知道如何指定它...... :(
我希望这足够清楚,因为问题总是很难解释 :) 任何帮助将不胜感激,因为这对我来说是一个非常重要的项目 :(
谢谢大家!
塞布:)