Изменения не отслеживаются при использовании проекций в Entity Framework Core 3.1 - PullRequest
1 голос
/ 30 января 2020

С проекциями (0 изменений):

var changesBefore = Db.ChangeTracker.Entries<OrderLocationEntity>().ToList(); //before change - 0

var orderLocation = Db.OrderLocation.AsTracking().Select(ol => new OrderLocationEntity
{
    Id = ol.Id,
    Address = ol.Address,
    City = ol.City,
    Created = ol.Created,
    OrderId = ol.OrderId,
    Zip = ol.Zip
}).First();

orderLocation.Address = "address";

var changesAfter = Db.ChangeTracker.Entries<OrderLocationEntity>().ToList(); //after change - 0

Без прогнозов (1 изменения)

var changesBefore = Db.ChangeTracker.Entries<OrderLocationEntity>().ToList(); //before change - 0

var orderLocation = Db.OrderLocation.AsTracking().First();

orderLocation.Address = "address";

var changesAfter = Db.ChangeTracker.Entries<OrderLocationEntity>().ToList(); //after change - 1

Настройка

Microsoft.EntityFrameworkCore 3.1.1

Microsoft.EntityFrameworkCore.Sqlite 3.1.1

var options = new DbContextOptionsBuilder<OrderDatabaseContext>()
                .UseSqlite("DataSource=:memory:")
                .Options;

Если результирующий набор содержит типы сущностей, выходящие из состава LINQ, EF Core будет отслеживать их.

Источник

https://docs.microsoft.com/en-us/ef/core/querying/tracking

Почему изменения не отслеживаются при использовании проекций?

Ответы [ 2 ]

2 голосов
/ 31 января 2020

Обратите внимание на "типы сущностей":

Если результирующий набор содержит типы сущностей , исходящие из композиции LINQ, EF Core будет отслеживать их.

Из тех же документов:

Если набор результатов не содержит типов сущностей , то отслеживание не выполняется.

Ваш Проекция не содержит типов сущностей, поэтому изменения не будут отслеживаться.

Например, если вы введете свойство для сохранения экземпляра OrderLocationEntity, этот экземпляр будет отслеживаться контекстом

var location = Db.OrderLocation.AsTracking()
    .Select(ol => new OrderLocationEntity
    {
        Id = ol.Id,
        Address = ol.Address,
        City = ol.City,
        Created = ol.Created,
        OrderId = ol.OrderId,
        Zip = ol.Zip,
        Location = ol // entity instance passed to the projected object
    })
    .First();

location.Location.Address = "New Address"; 

Db.ChangeTracker.Entries<OrderLocationEntity>().ToList(); //after change - 1
0 голосов
/ 30 января 2020

Потому что они не отслеживают их. Это было отключено в 3.1, когда проекты автоматически добавляют AsNoTracking.

Еще одно из множества решений, которые невозможно объяснить и которые делают EfCore 3.1 продуктом, который не может конкурировать с Ef 6.4.

...