12

TLDR; Entity Framework 5 코드화 된 마이그레이션을 사용하여 전체 텍스트 인덱스를 추가하는 방법Entity Framework 코드화 된 마이그레이션 내에서 전체 텍스트 색인 만들기

Entity 프레임 워크 마이그레이션을 사용하여 데이터베이스에 전체 텍스트 인덱스를 추가하는 데 문제가 있습니다. 처음부터 거기에 있어야하므로 자동으로 생성 된 InitialCreate 마이그레이션을 수정하려고 시도하고 있습니다.

DbMigrations API를 통해이를 수행 할 방법이 없기 때문에 'Up'코드의 끝에서 인라인 SQL을 실행하는 방법에 의지했습니다. 이는이 SQL에 도달 할 때까지 모든 것이 잘 작성되는 실행하면

Sql("create fulltext catalog AppNameCatalog;"); 
Sql("create fulltext index on Document (Data type column Extension) key index [PK_dbo.Document] on AppNameCatalog;"); 

는, 다음은 사용자 트랜잭션 내에서 사용할 수 없습니다 전체 텍스트 카탈로그 문을 CREATE 하여 SQL 오류 '가 발생합니다. '. 예상대로 작동하도록 설계되었습니다.

고맙게도 Sql()에는 마이그레이션 트랜잭션 외부에서 sql을 실행할 수있는 오버로드가 있습니다. 굉장해! 나는 생각했다.

Sql("create fulltext catalog AppNameCatalog;", true); 
Sql("create fulltext index on Document (Data type column Extension) key index [PK_dbo.Document] on AppNameCatalog;", true); 

그러나 낮은 제한 시간이 만료 새로운 시간 초과 오류 '에서 (위 참조) 결과이 작업을 수행하는 코드를 수정 보라. 작업이 완료되기 전에 시간 초과 기간이 경과되었거나 서버가 응답하지 않습니다. '

SQL을 뱉어 내고 수동으로 실행 해봤는데 정상적으로 작동했습니다. 나는 또한 생성 된 sql을 트랜잭션 외부에서 실행하고 실행하지 않고 diff'd 했으므로 SQL이 실행되는 방식으로 무언가이어야합니다.

미리 도움을 청하십시오!

답변

7

비슷한 문제가있었습니다. 내 InitialCreate 마이그레이션은 테이블을 만든 다음 오버로드 된 Sql()을 사용하여 해당 테이블에 전체 텍스트 인덱스를 추가하려고 시도하여 트랜잭션 외부에서 실행해야 함을 나타냅니다. 나는 또한 시간 초과 오류를 받고 있었고 스레드 교착 상태로 인한 것 같아요.

CreateTable() 대신 Sql() 호출을 사용하고 CREATE FULL TEXT CATALOG와 CREATE FULL TEXT INDEX 문을 단일 Sql() 호출로 병합하여 일부 시나리오에서 작동시킬 수 있습니다. 그러나 이것은 그리 신뢰할 만하지 않았습니다. 때로는 작동하고 때로는 동일한 시간 초과 오류로 실패합니다.

내가 찾은 유일한 해결책은 카탈로그 및 전체 텍스트 색인을 별도의 마이그레이션으로 이동하는 것이 었습니다.

+0

안녕하세요, 입력 해 주셔서 감사합니다. 그럼 별도의 마이그레이션으로 작동 했습니까? –

+1

Yip, 별도의 마이그레이션으로 작동하도록했습니다. 테이블 생성은 InitialCreate 마이그레이션에서 발생하며 전체 텍스트 카탈로그 및 인덱스는 InitialCreate 마이그레이션 후에 수행 할 별도의 마이그레이션으로 만들어집니다. – jspaey