我无法弄清楚如何使用Fluent配置我的mappins :(
这是我的情况: 我有一个Element对象,它(理论上)应该与Search对象有一对一的关系。但是,Search对象应与其自身具有一对多关系。 换句话说,一个Element对象最多可以有一个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”并设置为“S” “如果父对象是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对象, 第二个Element对象包含一个包含2个搜索对象的Search对象。
现在的问题是,当我检索数据时,第一个Element对象是正确的,但第二个不是。它的Search对象是ID'd 2,其中它应该是3(第二个Search对象的ID,其中父对象在数据库中标记为E)。
我的猜测是我应该以某种方式将一个.Where(“ParentType ='E'”)添加到Element对象映射中,就像我为Search对象所做的那样,但HasOne上没有.Where()方法( )方法(因为通常没有意义)。所以我真的不知道如何指定它...... :(
我希望这很清楚,因为问题总是很难解释:) 任何帮助将不胜感激,因为这对我来说是一个非常重要的项目:(
全部谢谢!
Seb:)
答案 0 :(得分:1)
HasOne没有考虑ReferenceAny的任何部分,因此它根本不能在这里使用。我看到的唯一选项是使用适当的ParentType = 'E'
映射私人搜索集合,并处理转换为属性Search
中的引用。