1

我不知道如何使用 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() 方法(因为拥有一个通常没有意义)。所以我真的不知道如何指定它...... :(

我希望这足够清楚,因为问题总是很难解释 :) 任何帮助将不胜感激,因为这对我来说是一个非常重要的项目 :(

谢谢大家!

塞布:)

4

1 回答 1

1

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

于 2012-08-14T06:30:08.537 回答