dotnet / efcore

EF Core is a modern object-database mapper for .NET. It supports LINQ queries, change tracking, updates, and schema migrations.
https://docs.microsoft.com/ef/
MIT License
13.8k stars 3.2k forks source link

Query: Optional dependents on sibling types sharing same columns #20334

Open smitpatel opened 4 years ago

smitpatel commented 4 years ago
    public class Third_One : Second
    {
        public OwnedType ThirdOwned { get; set; }
    }

    public class Third_Two : Second
    {
        public OwnedType Third_Two_Owned { get; set; }
    }
    [Owned]
    public class OwnedType
    {
        public string Value { get; set; }
    }
            modelBuilder.Entity<Third_One>().OwnsOne(e => e.ThirdOwned, b => b.Property(e => e.Value).HasColumnName("TValue"));
            modelBuilder.Entity<Third_Two>().OwnsOne(e => e.Third_Two_Owned, b => b.Property(e => e.Value).HasColumnName("TValue").HasColumnType("nvarchar(max)"));

db.Set<Second>().Select(e => new
                {
                    ((Third_One)e).ThirdOwned,
                    ((Third_Two)e).Third_Two_Owned,
                })

Here, when selecting data from server, we get values in same column. Which is not enough to identify which entity Type it is. We decided to create a conditional based on discriminator in such cases so we get Discriminator value of principal from database and only materialize correct entity for correct principal.

AndriySvyryd commented 4 years ago

See https://github.com/dotnet/efcore/issues/20332#issuecomment-600940420

smitpatel commented 4 years ago

When dependent owned type is sharing a column with owned type in base, then the column will have data even though dependent owned type is missing. One way to fix is to make sure dependent materialization conditions ignore shared columns. Another way to fix is this issue where we utilize parent's info to call into materialization.

Once this is fixed, we can enabled scenario described in #20343 too