Linq to Entity AcceptAllChanges SaveChanges - PullRequest
       9

Linq to Entity AcceptAllChanges SaveChanges

13 голосов
/ 21 февраля 2011

В чем разница между:

        db.AcceptAllChanges();
        // vs
        db.SaveChanges();

        db.AddToCustomer()
        // vs
        db.Customers.AddObject(Mycustomer);

и почему есть db.Customers.DeleteObject(Mycustomer); а нет db.DeleteFromCustomer(Mycustomer);

когда я должен использовать каждый?

также безопасна ли структура сущностей? Я имею в виду, если два потока обновят объект в контексте, то же самое время он потерпит крах?

спасибо заранее

Ответы [ 2 ]

12 голосов
/ 21 февраля 2011

db.AcceptAllChanges() предполагает, что вы закончили с любой связанной историей изменений, и отбрасывает ее - если у вас возникнут какие-либо дальнейшие проблемы, вы не сможете восстановить эти изменения.db.SaveChanges(false) сохраняет эти изменения в памяти в случае возникновения проблем.

Более подробный ответ см. http://blogs.msdn.com/b/alexj/archive/2009/01/11/savechanges-false.aspx.

db.AddToCustomer() - это строго типизированная оболочка вокругdb.Customers.AddObject().Посмотрите на определение этого, и вы поймете, что я имею в виду.Я бы использовал метод db.AddToCustomer() исключительно потому, что он строго типизирован и дает вам проверку типов времени компиляции.

Я думаю, единственная причина, по которой нет DeleteFromCustomer(), заключается в том, что они не думали, что работа будетнеобходимо (люди, как правило, добавляют больше, чем они удаляют).Однако ничто не мешает вам создавать свои собственные методы расширения, чтобы реализовать его самостоятельно.

EF не является поточно-ориентированным, если вы хотите выполнять обновления, вам нужно самостоятельно управлять блокировкой.См. http://blog.cincura.net/230902-multithreading-with-entity-framework/ для получения дополнительной информации:)

9 голосов
/ 21 февраля 2011

AcceptAllChanges только устанавливает все добавленные и измененные объекты в экземпляре ObjectContextStateManager в состояние Unchanged и отсоединяет все удаленные объекты, но он не выполнял изменения в базе данных. SaveChanges выполняет изменения в базе данных и по умолчанию также принимает изменения (можно настроить, чтобы они этого не делали).

AddToCustomer совпадает с Customers.AddObject - это просто ярлык (то же самое, что и DeleteObject). Первый метод генерируется генератором кода (и я думаю, что он вызывает второй, который является стандартным методом ObjectSet).

Структура сущностей не является поточно-ориентированной. Более того, вы должны быть очень осторожны , когда делитесь ObjectContext между несколькими потоками.

...