엔티티 프레임 워크를 사용하고 있습니다.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을 사용하고 있습니다 및 발생하지 않습니다.
롤백이 발생한다고 생각합니다 ... –
@IgorQuirino 시도했는데 롤백이 발생하지 않으며 update-database 명령이 실패해도 데이터베이스가 수정됩니다. –
또한 마이그레이션을 되돌리려면 Down() 코드가 있어야합니다. –