0

I have a record structure where I have a parent record with many children records. On the same page I will have a couple queries to get all the children.

A later query I will get a record set when I expand it it shows "Proxy". That is fine an all for getting data from the record since everything is generally there. Only problem I have is when I go to grab the record "ID" it is always "0" since it is proxy. This makes it pretty tough when building a dropdown list where I use the record ID as the "selected value". What makes this worse is it is random. So out of a list of 5 items 2 of them will have an ID of "0" because they are proxy.

I can use evict to force it to load at times. However when I am needing lazy load (For Grids) the evict is bad since it kills the lazy load and I can't display the grid contents on the fly.

I am using the following to start my session:

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

I even use ".SetFetchMode("MyTable", Eager)" within my queries and it still shows "Proxy".

Proxy is fine, but I need the record ID. Anyone else run into this and have a simple fix?

I would greatly appreciate some help on this.

Thanks.

Per request, here is the query I am running that will result in Patients.Children having an ID of "0" because it is showing up as "Proxy":

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

1 回答 1

0

I have found the silver bullet that fixes the proxy issue where you loose your record id! I was using ClearCache to take care of the problem. That worked just fine for the first couple layers in the record structure. However when you have a scenario of Parient.Child.AnotherLevel.OneMoreLevel.DownOneMore that would not fix the 4th and 5th levels. This method I came up with does. I also did find it mostly presented itself when I would have one to many followed by many to one mapping. So here is the answer to everyone else out there that is running into the same problem.

Domain Structure:

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

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

DomainBase:

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; }
}

Domain Mapping:

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

        Id(x => x.ID);

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

ClassMap:

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 回答