Search code examples
c#entity-frameworklazy-loadingproxy-classes

Why is LazyLoading not working?


Please see the code below:

class Program
{
    public class Request
    {
        public virtual int RequestId { get; set; }
        public virtual int LastStatus { get; set; }
        public virtual RequestType RequestType { get; set; }

        [InverseProperty("Request")]
        public virtual MembershipRequest MembershipRequest { get; set; }
        [InverseProperty("Request")]
        public virtual CodingRequest CodingRequest { get; set; }
    }

    public class MembershipRequest
    {
        [Key, ForeignKey("Request")]
  public virtual int RequestId { get; set; }
        public virtual Request Request { get; set; }
        public virtual string CompanyName { get; set; }
    }

    public class CodingRequest
    {
        [Key, ForeignKey("Request")]
        public virtual int RequestId { get; set; }
        public virtual Request Request { get; set; }
        public virtual string ProductName { get; set; }
    }

    public enum RequestType
    {
        MembershipRequest,
        CodingRequest
    }

    public class Context: DbContext
    {
        public Context()
            : base("ConnectionString")
        {

        }

        public DbSet<Request> Requests { get; set; }
        public DbSet<MembershipRequest> MembershipRequests { get; set; }
        public DbSet<CodingRequest> CodingRequests { get; set; }
    }

    static void Main(string[] args)
    {
        Insert();
        Select();
    }

    private static void Select()
    {
        using (var context = new Context())
        {
            foreach (var request in context.Requests.ToList())
            {
                Console.WriteLine(request.RequestType == RequestType.CodingRequest 
                    ? request.CodingRequest.ProductName : request.MembershipRequest.CompanyName);
                      //null reference here^
            }
            Console.ReadLine();
        }
    }

    private static void Insert()
    {
        using (var context = new Context())
        {
            var r1 = new Request
            {
                LastStatus = 1,
                RequestType = RequestType.MembershipRequest,
                MembershipRequest = new MembershipRequest
                {
                    CompanyName = "company1"
                }
            };
            context.Requests.Add(r1);

            var r2 = new Request
            {
                LastStatus = 2,
                RequestType = RequestType.CodingRequest,
                CodingRequest = new CodingRequest
                {
                    ProductName = "Product2"
                }
            };
            context.Requests.Add(r2);
            context.SaveChanges();
        }
    }
}

in the foreach statement, the request objects are of type Request, not a dynamic proxy. So, lazy loading is failing. The classes apparently satisfy all requirements for dynamic proxy creation and for lazy loading.

Why is it not working?


Solution

  • Because your entities' classes are nested in a non-public class Program therefore EF could not generate proxy classes for them. Consider changing your Program's access modifier to public or define your entities' classes outside of Program.