EF Core 3.1 Owned Entities returning null objects when querying database

725 Views Asked by At

I have a User class with an owned entity PersonalInformation that contains properties like FirstName, LastName, PhoneNumber, etc.

The User class is a table who's Id is pulled from another login database AspNetUsers that holds all login information.

When I try and read from the database, the PersonalInformation object is always null, even though data exists in the database. Here's the classes

public class User
{
    public string Id { get; set; }
    public PersonalInformation PersonalInformation { get; set; }
}

public class PersonalInformation
{
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
    public string MobilePhone { get; set; }
    public string HomePhone { get; set; }
    public string WorkPhone { get; set; }
    public string OtherPhone { get; set; }
    public DateTime DateOfBirth { get; set; }
}

And here's the configuration

public class UserConfiguration : IEntityTypeConfiguration<User>
{
    public void Configure(EntityTypeBuilder<User> builder)
    {
        builder.HasKey(x => x.Id);

        builder.OwnsOne(x => x.PersonalInformation, pi =>
        {
            pi.Property(x => x.FirstName).HasMaxLength(25);
            pi.Property(x => x.MiddleName).HasMaxLength(25);
            pi.Property(x => x.LastName).HasMaxLength(25);
            pi.Property(x => x.MobilePhone).HasMaxLength(15);
            pi.Property(x => x.HomePhone).HasMaxLength(15);
            pi.Property(x => x.OtherPhone).HasMaxLength(15);
            pi.Property(x => x.WorkPhone).HasMaxLength(15);
        });

        builder.Property(x => x.CreatedBy).HasMaxLength(36);
        builder.Property(x => x.LastModifiedBy).HasMaxLength(36);

    }
}

Here's an image of the database table we're pulling from

This is the call to the user table

var user = await context.Users
    .FindAsync(_currentUserService.UserId);

I've also tried this one too

var user = await context.Users
    .Include(x => x.PersonalInformation)
    .FirstOrDefaultAsync(x => x.Id == _currentUserService.UserId);

When I examine user in the debugger, I see that User.PersonalInformation is null, even though there's data in the database.

I've looked on here for someone with a similar problem, and they suggested the following. Each did not fix my issue:

  1. Add WithOwner() to UserConfiguration class
  2. Add virtual to PersonalInformation on User class (as if it was a navigation property)
  3. Add Include + FirstOrDefaultAsync() to query (as if it was a navigation property)
  4. Upgrade to latest version of EF Core (3.1.6 as of this post)
2

There are 2 best solutions below

1
On

I faced with the same problem and fixed it with explicit include of related object (used eager loading) https://learn.microsoft.com/en-us/ef/core/querying/related-data/

0
On

I found the issue. The DateTime DateOfBirth was null in the database which caused the entire object to be null. Once I provided a value in the database, it worked as expected