流利的NHibernate HasOne + ReferencesAny

时间:2012-08-09 14:20:27

标签: c# fluent-nhibernate fluent-nhibernate-mapping

我无法弄清楚如何使用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:)

1 个答案:

答案 0 :(得分:1)

HasOne没有考虑ReferenceAny的任何部分,因此它根本不能在这里使用。我看到的唯一选项是使用适当的ParentType = 'E'映射私人搜索集合,并处理转换为属性Search中的引用。