Base solution for your next web application
Open Closed

EF Core 2.1 Loading related Data #5276


User avatar
0
rvanwoezik created

Hi, I've extended User with HomeAddress, in EF core 2.0 i load the related entity like this:

var query = UserManager.Users
                .Include(e => e.HomeAddress)
                .Include(e => e.PostalAddress)
                .WhereIf(
                    !input.Filter.IsNullOrWhiteSpace(),
                    u =>
                        u.Name.Contains(input.Filter) ||
                        u.Surname.Contains(input.Filter) ||
                        u.UserName.Contains(input.Filter) ||
                        u.EmailAddress.Contains(input.Filter)
                );

Now in EF Core 2.1 my HomeAddress is empty. What am i forgetting? Thanks in advance

Markdown is supported
Copy & paste or drag & drop images (max 30 MB per image)

7 Answer(s)
  • User Avatar
    0
    maliming created
    Support Team

    It looks like there is no problem. You can see what the generated SQL statement is, isn't there no data in the database? Can you share more code?

    Markdown is supported
    Copy & paste or drag & drop images (max 30 MB per image)
  • User Avatar
    0
    rvanwoezik created

    Same db, same code only EF Core is newer

    Markdown is supported
    Copy & paste or drag & drop images (max 30 MB per image)
  • User Avatar
    0
    alper created
    Support Team

    weird! how about declaring those properties in the DbContext

    modelBuilder.Entity<User>(u=>
    {     
        u.HasOne(e => e.HomeAddress)
            .HasForeignKey(e => e.HomeAddressId);
    
        u.HasOne(e => e.PostalAddress)
            .HasForeignKey(e => e.PostalAddressId);
    }
    
    Markdown is supported
    Copy & paste or drag & drop images (max 30 MB per image)
  • User Avatar
    0
    rvanwoezik created

    <cite>alper: </cite> weird! how about declaring those properties in the DbContext

    modelBuilder.Entity<User>(u=>
    {     
       u.HasOne(e => e.HomeAddress)
           .HasForeignKey(e => e.HomeAddressId);
    
       u.HasOne(e => e.PostalAddress)
           .HasForeignKey(e => e.PostalAddressId);
    }
    

    What i have now, which works in EF Core 2.0 is

    modelBuilder.Entity<User>(b =>
                {
                    b.OwnsOne(u => u.HomeAddress);
                    b.OwnsOne(u => u.PostalAddress);
                });
    

    Here is extension of user class:

    ...
      public virtual MaritalStatusType MaritalStatus { get; set; }
    
      public virtual PhysicalAddress HomeAddress { get; set; }
    
      public virtual PostalAddress PostalAddress { get; set; }
    

    And here is my PhysicalAddress class

    [Table("PhysicalAddresses")]
        public class PhysicalAddress : CreationAuditedEntity<long>
        {
            public const int MaxStreetNameLength = 64;
            public const int MaxStateOrProvinceLength = 2;
            public const int MaxPostCodeLength = 7;
            public const int MaxCityNameLength = 32;
    
            [Required]
            [MaxLength(MaxCityNameLength)]
            public virtual string City { get; set; }
    
            [Required]
            [MaxLength(MaxStreetNameLength)]
            public virtual string Street { get; set; }
    
            [Required]
            [MaxLength(MaxPostCodeLength)]
            public virtual string PostalCode { get; set; }
    
            public virtual string Number { get; set; }
    
            [MaxLength(MaxStateOrProvinceLength)]
            public virtual string StateOrProvince { get; set; }
    
            public virtual string Latitude { get; set; }
    
            public virtual string Longitude { get; set; }
    
            [NotMapped]
            public virtual string StreetAddress => (this.Street + ' ' + this.Number).TrimEnd();
    
            public PhysicalAddress()
            {
            }
    
            public PhysicalAddress(string city, string street, string number, string postalCode, string stateOrProvince)
            {
                City = city;
                Street = street;
                Number = number;
                PostalCode = postalCode;
                StateOrProvince = stateOrProvince;
            }
        }
    
    Markdown is supported
    Copy & paste or drag & drop images (max 30 MB per image)
  • User Avatar
    0
    maliming created
    Support Team

    hi rvanwoezik I saw that you are using OwnsOne why you don’t use a one-to-many relationship. Because you have split the table [Table("PhysicalAddresses")]

    Can you create a simple demo that reproduces the problem.

    Markdown is supported
    Copy & paste or drag & drop images (max 30 MB per image)
  • User Avatar
    0
    rvanwoezik created

    I've found it, with help from [https://docs.microsoft.com/en-us/ef/core/modeling/owned-entities#mapping-owned-types-with-table-splitting])

    Removing CreationAuditedEntity<long> from the Owned class PhysicalAddress and PostalAddress is the fix.

    Markdown is supported
    Copy & paste or drag & drop images (max 30 MB per image)
  • User Avatar
    0
    maliming created
    Support Team

    :D

    Markdown is supported
    Copy & paste or drag & drop images (max 30 MB per image)