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?
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
.