1

私は FNH に 2 つの非常によく似たクエリを持っており、Project と Foo という同様のクラスに作用します。Foo は、Project から派生した新しいローカル クラスです。その classMap も Project の classMap から派生しています。

    public class Foo:pcm.Domain.Project { }
    public class FooMap : pcm.Mappings.ProjectMapBase<Foo> { }

同じセッションを使用した私のクエリは次のとおりです。

        var list = session.Query<Project>()
            .Take(10)
            .ToList();

        var list2 = session.Query<foo>()
            .Take(10)
            .ToList();

        Assert.Equal(list.Count(),list2.Count());

list には 30 個の要素があり、list2 には 10 個の要素があるため、アサーションは失敗します。実際には 10 個のプロジェクトしかありません。

編集:これは、独自のDLLにあるベースのマッピングです。

public class ProjectBaseMapTemplate<T> : ClassMap<T> where T: ProjectBase
{
    public ProjectBaseMapTemplate()
    {
        Table("proj");
        Id(x => x.MasterKey, "master_key");
        Map(x => x.ProjectName).Column("project_name");
        Map(x => x.ProjectTitle, "project_title");
    }
}
public class ProjectBaseMap : ProjectBaseMapTemplate<ProjectBase> { }

別の DLL にある派生クラスを次に示します。このようにクラスを DLL に分離することは、FNH をどのように使用する必要があるかという点で根本的に重要です。

    public class Foo:pcm.Domain.ProjectBase 
    {
            public virtual int ProjectState{ get; set; }
    }
    public class FooMap : pcm.Mappings.ProjectBaseMapTemplate<Foo> 
    {
        public FooMap()
        {
            Map(x=> x.ProjectState).Column("project_state");
        }
    }

更新ここに ProjectBase があります

public class ProjectBase
{
    public virtual string MasterKey { get; set; }
    public virtual string ProjectName { get; set; }
    public virtual string ProjectTitle { get; set; }
}
4

2 に答える 2

1

関数を使用するTake(10)と、基になるすべての選択クエリが RDBMS 機能に基づいて実行され、
上位 10 件の結果が返されます (ページング)

ORDER BY式を使用しないため、ページングと RDBMS 機能により、同じクエリが複数の実行で異なる結果になります。

役に立つことを願っています。

于 2013-02-07T21:17:50.947 に答える
0

これに関連している可能性があります:

(10) ポリモーフィズム (オプション、デフォルトは暗黙的): クエリ ポリモーフィズムが暗黙的または明示的のどちらで使用されるかを決定します。

暗黙的なポリモーフィズムとは、クラスのインスタンスがスーパークラスまたは実装されたインターフェイスまたはクラスを指定するクエリによって返され、クラスのサブクラスのインスタンスがクラス自体を指定するクエリによって返されることを意味します。明示的なポリモーフィズムとは、クラス インスタンスが返されるのは、そのクラスを明示的に指定したクエリのみであり、クラスを指定したクエリは、この宣言内で または としてマップされたサブクラスのインスタンスのみを返すことです。ほとんどの場合、デフォルトの polymorphism="implicit" が適切です。明示的なポリモーフィズムは、2 つの異なるクラスが同じテーブルにマップされている場合に役立ちます (これにより、テーブル列のサブセットを含む「軽量」クラスが可能になります)。

したがって、次を使用してマッピングを修正します。Polymorphism.Explicit();

元。

public class FooMap : pcm.Mappings.ProjectBaseMapTemplate<Foo> 
{
    public FooMap()
    {
        Polymorphism.Explicit();
        Map(x=> x.ProjectState).Column("project_state");
    }
}
于 2013-02-07T22:05:05.693 に答える