Linq to Entity AcceptAllChanges SaveChanges

В чем разница между следующим:

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

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

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

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

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

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


person Stacker    schedule 21.02.2011    source источник


Ответы (2)


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/ чтобы узнать больше :)

person Duncan Watts    schedule 21.02.2011
comment
AddObject также является строго типизированным, потому что это метод универсального типа ObjectSet‹T› — в этом сценарии ObjectSet‹Customer› и определением метода является AddObject (сущность Customer). - person Ladislav Mrnka; 22.02.2011

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

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

Entity framework не является потокобезопасным. Кроме того, вы должны быть очень осторожны при совместном использовании ObjectContext между несколькими потоками.

person Ladislav Mrnka    schedule 21.02.2011