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

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

<code>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; }
}
</code>

Спасиб

 Karsten18 июн. 2013 г., 13:25
Для новых читателей этот блог может быть полезен: Blog.oneunicorn.com / 2012/03/10 / ...

Ответы на вопрос(1)

Решение Вопроса

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

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

 Yair Nevet30 апр. 2012 г., 13:12
это ссылка?
 Yair Nevet30 апр. 2012 г., 11:53
hi, как контекст узнает об объекте customer? Как это связано / связано?
 Ladislav Mrnka30 апр. 2012 г., 12:11
Context знает об этом, потому что вы получили объект customer через тот же экземпляр контекста, вызвавCustomers.Find
 Slauma30 апр. 2012 г., 15:37
@ Ladislav: Означает ли ваше последнее предложение, что отслеживание изменений прокси хуже в производительности, чем отслеживание изменений снимков в некоторых ситуациях? Вы знаете примеры? Я всегда думал, что отслеживание изменений прокси-сервера намного быстрее в любой ситуации ...
 Ladislav Mrnka01 мая 2012 г., 21:06
@ Слаума: ПроверитьЭта стать. Артур является членом EF Dev. team, и если вы проверите каждый пример кода, предоставленный командой ADO.NET или шаблоном генератора DbContext, вы увидите, что прокси-серверы отслеживания изменений больше не являются поведением по умолчанию. Похоже, что проблемы с производительностью отслеживания изменений моментальных снимков легче выявить и решить, переключившись на прокси отслеживания изменений.

Ваш ответ на вопрос