Совместное использование Attach() и Entry() в Entity Framework

314
18 июля 2017, 17:23

Заметил, что часто используют эти методы в связке:

context.Set<User>().Attach(user);
context.Entry(user).State = EntityState.Modified;

В чем смысл такого использования, если можно использовать только context.Entry(user) когда нужно изменить состояние?
При этом автоматически будет вызван context.Set<User>().Attach(user);, или я ошибаюсь?

Answer 1

В чем суть, когда мы вызываем:

context.Entry(user).State = EntityState.Modified;

мы не только прикрепляем сущность к DbContext, но и говорим что сущность является грязной. Это заставит EF в случае обновления, сгенерировать запрос update, который обновит все поля, которые присутствуют в данной сущности, несмотря на то, что в реальности могло измениться значение всего лишь одного поля.

когда мы вызываем:

context.Set<User>().Attach(user);

мы просто прикрепляем сущность к DbContext, при этом свойство State у сущности равно EntityState.Unchanged. Это значит, что в случае изменения какого-то одно из полей, EF сгенерирует update запрос, который обновит только это поле.

Вызов методов:

context.Set<User>().Attach(user);
context.Entry(user).State = EntityState.Modified;

на мой взгляд избыточен.

Answer 2

Отсюда

If you have an entity that you know already exists in the database but which is not currently being tracked by the context then you can tell the context to track the entity using the Attach method on DbSet. The entity will be in the Unchanged state in the context.

Если у вас есть сущность о которой вам известно, что она уже есть в БД, но при этом данная сущность не отслеживается в данном контексте, то вы можете присоединить ее к данному контексту путем Attach метода в DbSet. В таком случае данная сущность будет иметь статус Unchanged (неизмененная).

READ ALSO
Изменить иконку формы CSharpCodeProvider c#

Изменить иконку формы CSharpCodeProvider c#

Динамически компилирую ехе

292
Различия методов Find(), FirstOrDefault() при использовании с Entity Framework

Различия методов Find(), FirstOrDefault() при использовании с Entity Framework

Если нужно получить запись из базы данных по ее первичному ключу, можно воспользоваться и тем и другим методомОба метода вернут объект сущности,...

393
c# blend создание кнопок

c# blend создание кнопок

Как в Blend с помощью кода создать кнопку и присвоить ей шаблон программно ?

289
Альтернатива VBMath.Rnd() в C#

Альтернатива VBMath.Rnd() в C#

Рассматривал пример программы, в которой весь код написан на C#, а в одной функции используется фрагмент, написанный на VBВопрос в том, как перевести...

239