Linq to Entity AcceptAllChanges SaveChanges

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

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

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

и почему существует db.Customers.DeleteObject(Mycustomer); и no db.DeleteFromCustomer(Mycustomer);

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

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

заблаговременно

Ответы

Ответ 1

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/:)

Ответ 2

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

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

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