VahidN / EFSecondLevelCache.Core

Entity Framework Core Second Level Caching Library
Apache License 2.0
326 stars 51 forks source link

Unable to include navigation properties when using EFCachedDbSet #65

Open seroche opened 4 years ago

seroche commented 4 years ago

Summary of the issue

Calling Include on an EFCachedDbSet does not include the property as expected.

Environment

.NET Core SDK version: 3.1.1 (latest stable)
Microsoft.EntityFrameworkCore version: 3.1.1 (latest stable) 
EFSecondLevelCache.Core version: 2.9.1 (latest stable)

Example code/Steps to reproduce:

I'm using the following entity extracted from my MSSQL DB.

public class Category : Entity<string>
{
    public string Name { get; private set; }
    public string ParentCategoryId { get; private set; }
    public ICollection<Category> SubCategories { get; private set; }

    protected Category() { }
}

In EF Core, the binding is created as followed:

builder.Entity<Category>(m =>
{
    #region Mappings
    m.ToTable("Category", "social");

    m.Property(x => x.Id)
        .HasColumnName("CategoryId");

    m.HasKey(x => x.Id);

    m.HasMany(x => x.SubCategories)
        .WithOne()
        .HasForeignKey(x => x.ParentCategoryId);
    #endregion
});

Outputs

When I call the following code, SubCategories are all NULL.

db
.Set<Category>()
**.Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromDays(7))**
**.Include(x => x.SubCategories)**
.ToListAsync(token);

If I move the include before the Cacheable(), then it works fine.

db
.Set<Category>()
**.Include(x => x.SubCategories)**
**.Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromDays(7))**
.ToListAsync(token);

I assume it's related to #39. It would convenient if we could call the include on the EFCachedDbSet. This way we can keep the Cache mgt code within one class (the DbContext)

image

Rayvid commented 4 years ago

The proxy class will never work after the entity retrieved from Cacheable. That's design limitation I imagine very hard to overcome.

My thoughts on this https://github.com/VahidN/EFSecondLevelCache.Core/issues/63 I guess you need either quit using lazy loading, either wait for EFCore changes to be able to disable proxy creation on will

VahidN commented 4 years ago

Announcing a better Second Level Caching Library!