Подтвердить что ты не робот

Как отслеживание изменений работает в Entity Framework

Учитывая следующий код, как EF/DbContext знает об изменениях, внесенных в объект клиент:

class Program
{
    static void Main()
    {
        using(var shopContext = new ShopContext())
        {
            var customer = shopContext.Customers.Find(7);

            customer.City = "Marion";

            customer.State = "Indiana";

            shopContext.SaveChanges();
        }
    }
}

public class ShopContext : DbContext
{
    public DbSet<Customer> Customers { get; set; }
}

public class Customer
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string City { get; set; }
    public string State { get; set; }
}

Спасибо

4b9b3361

Ответ 1

Когда вы загружаете объект из контекста, он сохраняет дополнительную структуру данных - позвольте ему называть его. Запись содержит два набора значений - исходные значения и текущие значения. Когда вы выполняете операцию SaveChanges, EF проходит через ваши объекты клиента и обновляет текущие значения в записи, чтобы они соответствовали реальному состоянию вашего объекта - эта операция называется обнаружением изменений. Во время генерации команды SQL EF будет сравнивать текущие и исходные значения и строить инструкцию обновления SQL для изменения измененных значений в базе данных. Эта операция называется отслеживанием изменений моментальных снимков. EF сохраняет записочную запись в записи.

Существует альтернатива, называемая отслеживанием динамических изменений, которая будет изменять текущее значение в записи, одновременно присваивая значение свойству entity. Динамическое отслеживание изменений имеет особые требования (например, все ваши свойства в сущности должны быть virtual), потому что он должен обернуть ваш класс динамическому прокси во время выполнения. Это было предпочтительным способом, но из-за некоторых проблем с производительностью в сложных сценариях отслеживание изменений моментальных снимков в настоящее время предполагается использовать по умолчанию.