2011-02-21 6 views
13
는 다음의 차이 무엇입니까

:Linq에 엔티티 AcceptAllChanges SaveChanges를에

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

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

이와 내가 하나 하나를 사용해야 할 때 왜 db.Customers.DeleteObject(Mycustomer);없이 db.DeleteFromCustomer(Mycustomer);

가?

엔티티 프레임 워크는 threadsafe입니까? 두 스레드가 문맥 sametime에서 객체를 업데이트하면 충돌이 발생합니까? 사전

답변

12

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/을 참조하십시오.

+0

AddObject는 일반 유형 ObjectSet 의 메서드이기 때문에 강력하게 형식화됩니다.이 시나리오에서는 ObjectSet 이고 메서드의 정의는 AddObject (Customer 엔터티)입니다. –

9

AcceptAllChanges에서

감사는 Unchanged 상태로 ObjectContextStateManager 인스턴스의 모든 추가 및 수정 된 개체를 설정하고 삭제 된 모든 개체를 분리하지만, 데이터베이스의 변경 사항을 실행하지 못했습니다. SaveChanges은 데이터베이스의 변경 사항을 실행하며 기본적으로 변경 사항을 수락합니다 (수행하지 않도록 구성 할 수 있음).

AddToCustomerCustomers.AddObject과 동일합니다. 바로 가기입니다 (DeleteObject과 동일). 첫 번째 방법은 코드 생성기 (코드 생성기)에서 생성합니다 (두 번째 방법은 ObjectSet의 표준 방법입니다).

엔티티 프레임 워크는 스레드로부터 안전하지 않습니다. 또한 여러 스레드간에 ObjectContext을 공유 할 때는 very careful이어야합니다.