2016-12-07 11 views
5

При поиске лучших практик выполнения операции CRUD через EF я заметил, что перед обновлением объекта настоятельно рекомендуется использовать методы или Find(). Он хорошо работает и, согласно документации EF, эти методы приносят сущность в контекст, который для меня совершенно ясен. Но следующий код меня смутил.Зачем использовать Attach для обновления Entity Framework 6?

public void Update(object entity) 
{ 
    Record record = new Record() { 
     id = 1, 
     value = 5 
    }; 
    using (SomeContext ctx = new SomeContext()) 
    { 
     ctx.Entry(record).State = EntityState.Modified; 
     ctx.SaveChanges(); 
    } 
} 

Предположим, у нас есть запись с id = 1 в базе данных. При этом условии вышеописанный код обновит запись (установите значение 5). Вопрос в том, почему он работает? И тогда почему я должен использовать Attach() ?. Насколько я понимаю, запись никак не привязана к контексту. Я прочитал соответствующие главы книги this и the tutorial, но они используют подход с двумя запросами. Также я сердито, но не нашел ответа на мой вопрос. Помогите мне с объяснением или некоторыми хорошими материалами, пожалуйста.

ответ

12

Если у вас есть сущность, которая, как вы знаете, уже существует в базе данных, но которая в настоящее время не отслеживается контекстом, как ваш случай, тогда вы можете указать контексту для отслеживания объекта с использованием метода на DbSet. Итак, вкратце, какой метод Attach отслеживает сущность в контексте и меняет свое состояние на Unchanged. После изменения какого-либо свойства после этого изменения отслеживания изменят свое состояние на Modified для вас. В случае, когда вы выставляете выше, вы прямо заявляете, что это состояние - это Modified, но также присоединяйте сущность к вашему контексту. Подробное описание вы можете найти в этом документе post.

Когда вы должны использовать метод Attach?

Если у вас есть объект, который вы знаете, уже существует в базе данных, но нужно внести некоторые изменения:

var entity= new Entity{id=1}; 
context.YourDbSet.Attach(entity); 

// Do some change... 
entity.value=5; 

context.SaveChanges(); 

Это то же самое:

context.Entry(entity).State = EntityState.Unchanged; 

// Do some change... 
entity.value=5; 

context.SaveChanges(); 

Когда вы должны изменить субъекта Состояние для изменения явно?

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

+0

спасибо, но почему эта запись в настоящее время отслеживается контекстом? –

+0

Если объект отслеживается и вы изменяете какое-либо свойство, состояние объекта должно измениться на «Изменено» из-за изменения отслеживания, но для этого ваши сущности должны соответствовать этим требованиям [https://msdn.microsoft.com/ en-us/library/dd468057 (v = vs.100) .aspx) – octavioccl

+0

Я думаю, что это [ссылка] (https://www.safaribooksonline.com/library/view/programming-entity-framework/9781449331825/ch04s03.html) мог ответить на все ваши вопросы. – octavioccl