2016-11-23 6 views
0

엔티티 프레임 워크를 사용하고 있습니다.C# EntityFramework Up 메서드 ¿ SQL이 중간에 실패하면 어떻습니까?

alter table `Users` add column `atribute21` longtext 
wrong sql command 

그래서 엔티티 프레임 워크는 첫 번째를 실행합니다 :

public override void Up() 
    { 
     AddColumn("Users", "atribute21", c => c.String(unicode: false)); 

     Sql("wrong sql command"); 
    } 

내가 intencionally 나쁜 SQL 명령을 쓰기 포인트가 될 것 실행될 SQL 코드는 다음과 같습니다 이 내 위로 방법 SQL 문장을 변경하고 내 데이터베이스에서 속성 "atribute21"을 변경하지만 실패하면 __migrationhistory 테이블이 수정되지 않습니다.

그래서 실제로 Entity 프레임 워크는 일관성없는 상태가됩니다. update 명령으로 일부 변경 사항이 데이터베이스에 적용되었지만 마이그레이션이 완료되지 않았습니다. 사실 나는 심지어 업데이트 데이터베이스 TargetMigration으로 롤백 할 수 없다 : "마이그레이션"또는 업데이트 데이터베이스 또는 무엇이든.

이 문제를 해결하는 유일한 방법은 수동으로 "atribute21"을 users 테이블에서 삭제하고, 잘못된 sql 코드를 삭제하고 다시 마이 그 레이션하는 것입니다. 이 예제의이 솔루션은 매우 간단하지만 확장 성이 없습니다. 예를 들어 데이터베이스의 데이터를 채우기 위해 up 메소드에 30 개의 sql 명령이 있고 그 중 하나가 실패하면 어떻게됩니까?

¿이 엔티티 프레임 워크를 사용하여 어떻게 복구 할 수 있습니까?

¿ 엔티티 프레임 워크에서 기본적으로 up 메소드가 SQL 트랜잭션이 아니어야합니까?

¿ 어떻게 업 메서드가 SQL 트랜잭션이되도록 엔터티 프레임 워크를 구성 할 수 있습니까?

참고 :SQL 시작과 SQL 끝을 업 메서드에 추가하는 것은 방법이지만, 나는 이것이 좋은 해결책이 아니라고 생각합니다. 자동으로 수행 할 것이 있습니다.

편집 : Microsoft SQL Server를 사용하는 경우

자동 롤백의 최대 방법이 존재하지만 MySQL은/​​MariaDb을 사용하고 있습니다 및 발생하지 않습니다.

+0

롤백이 발생한다고 생각합니다 ... –

+1

@IgorQuirino 시도했는데 롤백이 발생하지 않으며 update-database 명령이 실패해도 데이터베이스가 수정됩니다. –

+0

또한 마이그레이션을 되돌리려면 Down() 코드가 있어야합니다. –

답변

0

"엔티티 프레임 워크를 사용하여 어떻게 복구 할 수 있습니까?"

"어떻게 업 스키마가 SQL 트랜잭션이 될 수 있도록 엔티티 프레임 워크를 구성 할 수 있습니까?"

하는 하여 TransactionScope를 사용하여 시도하는 것은

using System.Transactions; 

코드 :

using (TransactionScope transaction = new TransactionScope()) 
{ 
    try 
    { 
     //Do whatever 

     transaction.Complete(); 
    } 
    catch (Exception) 
    { 
     throw; 
    } 
} 

"위 방법은 엔티티 프레임 워크에서 기본적으로 SQL 트랜잭션해야하지 않습니까?"

  • @IgorQuirino @lgorQuirino 시도했는데 롤백이 발생하지 않으면 update-database 명령이 실패해도 데이터베이스가 수정됩니다.
  • 그래서, 아니요 ...

도와 드리겠습니다.