2013-10-11 6 views
0

저는 EntityFramework 4.1을 사용합니다.SaveChanges()의 기본 동작을 재정 의하여 SaveChanges()를 여러 번 호출하려면 어떻게해야합니까?

달성하고자하는 것은 FooEntity 인 엔티티에서 SaveChanges 메소드가 호출 될 때마다 먼저 해당 엔티티를 업데이트 한 후 삭제하고 싶습니다.

아래와 같이 기본 동작을 재정의하려고 시도하지만 원하는대로 달성 할 수 없습니다. Db를 업데이트합니다. 삭제는 허용되지 않습니다.

어떻게하면됩니까?

public override int SaveChanges() 
     { 
      var entitiesMarkedAsDelete = ChangeTracker.Entries<FooEntity>() 
            .Where(e => e.State==EntityState.Deleted); 

      foreach (var e in entitiesMarkedAsDelete) 
      { 
       e.State = EntityState.Modified; 
      } 

      base.SaveChanges(); // To enforce an UPDATE first 

      // Now, I try to re-mark them to DELETE 
      foreach (var e in entitiesMarkedAsDelete) 
      { 
       e.State = EntityState.Deleted; 
      } 

      base.SaveChanges(); // And hope that they will be deleted 

      // RESULT: 1st call of base.Savechanges() updates the entities 
      //  but the 2nd call of base.Savechanges() does not make any changes on the UPDATED 
      //  entities -and they are NOT DELETED. 

     } 
+0

SaveChanges의 첫 번째 호출은 어떻게 든 changeTracker를 새로 고칩니다. EntityState를 Deleted로 변경하더라도이를 무시합니다. 그러나 내가 옳다해도 이것을 어떻게 돌봐야할지 모르겠다. – pencilCake

+0

엔티티 프레임 워크 – pencilCake

+0

나는 그럴만 한 이유가 있다고 확신하지만, 삭제하기 전에 업데이트는 무의미한 것으로 보입니까? – James

답변

1

나는 당신이 여기 LINQ의 게으른 본성에 속고 있다고 생각합니다.

var entitiesMarkedAsDelete = ChangeTracker.Entries<FooEntity>() 
          .Where(e => e.State==EntityState.Deleted); 

.. 그것이 반복 될 때마다 평가되고, 그래서 두 번째 foreach는 당신 위에, 당신은 실제로 존재하기 때문에, 다시 어떤 결과를 얻을하지 않습니다

순서 여기서 생성 더 이상 삭제 된 상태의 엔티티가 아닙니다.

이 문제를 해결하려면 시퀀스를 fx로 파이프하면됩니다. 거기에 .ToList를 호출하여 목록 :

var entitiesMarkedAsDelete = ChangeTracker.Entries<FooEntity>() 
          .Where(e => e.State==EntityState.Deleted).ToList(); 

그런 식으로 모두의 foreach 문은 같은 개체를 반복합니다, 그들은 제대로 삭제해야합니다.

+0

피터 (Peter)는 내가 성취하고자하는 것을 도왔습니다. 첫 번째 SaveChanges에서는 커밋되고 두 번째 SaveChanges에서는 삭제됩니다. 그러나 트랜잭션 내에서 트랜잭션이 완료되지 않았다고 생각합니다. 따라서 DELETE가 실패하면 UPDATE는 롤백되지 않습니다. 권리? – pencilCake

+1

예, 두 가지 호출이 두 가지 다른 트랜잭션이므로 이제는 업데이트를 롤백 할 필요가 없습니다. 그러나 당신은 그것들을 하나의 트랜잭션으로 결합 할 수 있어야합니다. [여기에 몇 가지 정보가 있습니다] (http://stackoverflow.com/questions/12809958/ef-how-do-i-call-savechanges-twice-inside-a-transaction) –

+0

마지막 사항 : 그것이 합리적이라고 생각하십니까? .Detached 상태도 포함 시키려면? – pencilCake