Search code examples
c#entity-frameworklinq-to-entitieslazy-loadingentity-framework-migrations

Null returned when trying to access child object


I am in the process of migrating to EF6 from Linq To Sql, and I have the autogenerated object

public partial class PCU
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public PCU()
    {
        this.PUs = new HashSet<PU>();
    }

    public int ID { get; set; }
    public int FileNumberID { get; set; }
    public Nullable<int> PartnerID { get; set; }

    public virtual Company Company { get; set; }
    public virtual File File { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<PU> PUs { get; set; }
}

where PartnerID is the Foreign key for company

when I call:

var company = dc.Set<PCU>().FirstOrDefault(c => c.FileNumber == fileNumber).Company;

I get a Null object, however if I call:

var company = dc.Set<PCU>().Where(c => c.FileNumber == fileNumber).Select(x => x.Company).First();

It returns the company object as expected. I have both LazyLoading and ProxyCreation enabled.

I understand I could use:

var company = dc.Set<PCU>().Include(x => x.Company).FirstOrDefault(c => c.FileNumber == fileNumber).Company;

however, as this is existing code, and I have the same problem for hundreds of different objects, this will mean massive amounts of changes. Is there an easier way to achieve this?


Solution

  • As a follow up, I believe the cause of the error is the name of the ForeignKey (PartnerID), and if it were named "CompanyID" it would work fine.

    I have had to bite the bullet, and had to implement

    var company = dc.Set<PCU>().Include(x => x.Company).FirstOrDefault(c => c.FileNumber == fileNumber).Company;
    

    where neccesary. There does not seem to be another workaround, except for renaming the columns in my DB (which I can't do).