list.Clear () против нового List <> () - ASP.NET Core - ядро ​​Entity Framework - отложенная загрузка - PullRequest
0 голосов
/ 08 сентября 2018

Через некоторое время, расследуя, почему мое свойство навигации снова заполняется только что удаленными сущностями (используя entity.NavigationPropertiesCollection = new List <> ()), я понял, что с entity.NavigationPropertiesCollection.Clear () все работает нормально , У меня вопрос: почему Entity Framework Core снова загружает свойства навигации после повторной инициализации коллекции свойств навигации и почему с entity.NavigationPropertiesCollection.Clear () все работает нормально? (удаляет их как положено)

Необходимые пакеты nuget: Microsoft.EntityFrameworkCore.Proxies

Microsoft.EntityFrameworkCore.SqlServer

Microsoft.EntityFrameworkCore.Tools

Необходимый код:

public class FooChildEntity
 {
       public int Id { get; set; }
       public string Name { get; set; }
 }
public class FooParentEntity
{
    public int Id { get; set; }
    public string Title { get; set; }
    public virtual List<FooChildEntity> FooChildEntities { get; set; }
}

internal class FooDbContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder
            .UseLazyLoadingProxies()
            .UseSqlServer(@"Server=.\sqlexpress;Database=fooDb;Trusted_Connection=True;");
    }

    public DbSet<FooParentEntity> FooParentEntities { get; set; }
} 

Код для воспроизведения:

Сначала запустите этот код:

     FooParentEntity fooParentEntityInput = new FooParentEntity
        {
            Title = "cool title",
            FooChildEntities = new List<FooChildEntity>
            {
                new FooChildEntity
                {
                    Name = "FirstChild"
                },
                new FooChildEntity
                {
                    Name="SecondChild"
                }
            }
        };

        FooDbContext fooDbContext = new FooDbContext();
        fooDbContext.FooParentEntities.Add(fooParentEntityInput);

        fooDbContext.SaveChanges();

и удалите его или закомментируйте.

После этого следующий код использует точки останова, как на скриншотах

FooDbContext fooDbContext = new FooDbContext();

FooParentEntity fooParentEntityDb = fooDbContext.FooParentEntities.ToList().FirstOrDefault();
fooParentEntityDb.FooChildEntities = new List<FooChildEntity>();
fooParentEntityDb.FooChildEntities.Add(new FooChildEntity { Name = "ThirdChild" });

Здесь появляется ошибка: https://i.stack.imgur.com/tZ1j0.png

Однако если использование нескольких точек останова при отладке, как на скриншотах: https://i.stack.imgur.com/naCxJ.png https://i.stack.imgur.com/Ky7K5.png https://i.stack.imgur.com/iziRr.png

Все отлично работает.

...