0

多くの子レコードを持つ親レコードを持つレコード構造があります。同じページに、すべての子を取得するためのクエリがいくつかあります。

後でクエリを展開すると、「プロキシ」と表示されるレコード セットが取得されます。すべてが通常そこにあるため、レコードからデータを取得するのに問題ありません。私が抱えている唯一の問題は、レコード「ID」を取得しようとすると、プロキシであるため常に「0」になることです。これにより、レコード ID を「選択した値」として使用するドロップダウン リストを作成するときに、かなり困難になります。これをさらに悪化させるのは、ランダムであることです。したがって、5 つの項目のリストのうち、2 つの項目はプロキシであるため ID が「0」になります。

evict を使用して、時々強制的にロードすることができます。ただし、遅延ロードが必要な場合 (グリッドの場合) は、遅延ロードが強制終了され、その場でグリッドの内容を表示できないため、エビクトは良くありません。

セッションを開始するために以下を使用しています。

ISession session = FluentSessionManager.SessionFactory.OpenSession();
session.BeginTransaction();
CurrentSessionContext.Bind(session);

クエリ内で ".SetFetchMode("MyTable", Eager)" を使用しても、まだ "Proxy" と表示されます。

プロキシは問題ありませんが、レコード ID が必要です。他の誰かがこれに遭遇し、簡単な修正をしていますか?

これについて何か助けていただければ幸いです。

ありがとう。

リクエストごとに、「プロキシ」として表示されているため、Patients.Children の ID が「0」になるクエリを実行しています。

    public IList<Patients> GetAllPatients()
    {
        return FluentSessionManager.GetSession()
            .CreateCriteria<Patients>()
            .Add(Expression.Eq("IsDeleted", false))
            .SetFetchMode("Children", Eager)
            .List<Patients>();
    }
4

1 に答える 1

0

レコード ID が失われるというプロキシの問題を解決する特効薬を見つけました! 問題を処理するために ClearCache を使用していました。これは、レコード構造の最初の数層でうまく機能しました。ただし、4 番目と 5 番目のレベルを修正しない Parient.Child.AnotherLevel.OneMoreLevel.DownOneMore のシナリオがある場合。私が思いついたこの方法はそうです。また、1対多の後に多対1のマッピングが続く場合に、それがほとんど現れることもわかりました。そこで、同じ問題に直面している他のすべての人への答えを次に示します。

ドメイン構造:

public class Parent : DomainBase<int>
{
    public virtual int ID { get { return base.ID2; } set { base.ID2 = value; } }

    public virtual string Name { get; set; }
    ....
}

ドメインベース:

public abstract class DomainBase<Y>, IDomainBase<Y>
{
    public virtual Y ID //Everything has an identity Key.
    {
        get;
        set;
    }

    protected internal virtual Y ID2 // Real identity Key
    {
        get
        {
            Y myID = this.ID;
            if (typeof(Y).ToString() == "System.Int32")
            {
                if (int.Parse(this.ID.ToString()) == 0)
                {
                    myID = ReadOnlyID;
                }
            }

            return myID;
        }
        set
        {
            this.ID = value;
            this.ReadOnlyID = value;
        }
    }
    protected internal virtual Y ReadOnlyID { get; set; } // Real identity Key
}

IDomainBase:

public interface IDomainBase<Y>
{
    Y ID { get; set; }
}

ドメイン マッピング:

public class ParentMap : ClassMap<Parent, int>
{
    public ParentMap()
    {
        Schema("dbo");
        Table("Parent");

        Id(x => x.ID);

        Map(x => x.Name);
        ....
    }
}

クラスマップ:

public class ClassMap<TEntityType, TIdType> : FluentNHibernate.Mapping.ClassMap<TEntityType> where TEntityType : DomainBase<TIdType>
{
    public ClassMap()
    {
        Id(x => x.ID, "ID");
        Map(x => x.ReadOnlyID, "ID").ReadOnly();
    }
}
于 2013-05-06T14:31:03.620 に答える