Entity Framework 4를 사용하여 매우 간단한 데이터베이스를 만들었습니다. 엔티티에서 트랜잭션을 사용할 수 있기를 원하지만 변경 내용을 롤백하지 못하는 것 같습니다. 엔티티가 데이터베이스에 저장되기 전에 엔티티에 대한 임시 변경 사항을 포기하는 방법이 필요합니다.Entity Framework 개체 컨텍스트를 사용하여 트랜잭션을 수행하는 방법은 무엇입니까?
예를 들어, 다음 코드는 엔터티 프레임 워크 개체 컨텍스트 "MusicContainer"를 사용합니다. TransactionScope 내에서 아티스트 엔티티가 생성됩니다. 트랜잭션은 완료되지 않고 종료됩니다. 그래서 트랜잭션이 롤백되기를 기대합니다. 하지만, 처음에는 TransactionScope를 만들지 않은 것처럼 프로그램이 실행됩니다. TransactionScope가 끝나면 music.SaveChanges() 줄이 개체를 데이터베이스에 저장합니다. 엔티티 프레임 워크는 TransactionScope에에게 내가 여기에 기대하고있어 방법을 사용하지 않는 경우
class Program
{
static void Main(string[] args)
{
using (MusicContainer music = new MusicContainer())
{
using (TransactionScope transaction = new TransactionScope())
{
Artist artist = new Artist { Name = "Test" };
music.Artists.AddObject(artist);
}
// The transaction ended without Complete(); shouldn't the changes be abandoned?
music.SaveChanges();
}
}
}
, 어떻게 내가 찾는 기능을 얻을 수 있나요? 함수 호출자가 MusicContainer를 전달하는 몇 가지 상황이 있습니다. 함수에서 돌아 오기 전에 MusicContainer를 깨끗한 상태로 두어야합니다 (즉, 변경 사항을 롤백하여 우연히 다른 SaveChanges와 함께 저장되지 않도록합니다). 동일한 MusicContainer 개체에 있음).
각 거래마다 별도의 "using (MusicContainer music = new MusicContainer())"를 사용 하시겠습니까? 첫 번째 의심은 병행으로 수십 개가 병목 현상이 될 경우 병목 현상이 될 수 있다는 것이 었습니다. –
@notfed 오버 헤드가 거의 없다고 생각합니다. DB 연결은 필요할 때, 즉 SaveChanges()를 호출하거나 쿼리를 수행 할 때 EF에서만 사용됩니다.이 MSDN 기사도 확인하십시오. http://msdn.microsoft.com/ ko-kr/library/cc853327.aspx – BrokenGlass
@notfed : 각 트랜잭션마다 새 컨테이너를 사용해야합니다. 읽기 : http://stackoverflow.com/questions/3653009/entity-framework-and-connection-pooling/3653392#3653392 –