2017-09-14 4 views
2

나는 데이터베이스를 만들려면 먼저 EF6 코드를 사용하고 있습니다. 마이 그 레이션을 추가하고 데이터베이스를 업데이트 할 때 기본적으로 테이블의 모든 외래 키에 대해 항상 Non-cluster Index을 만듭니다.EF6 외래 키에 인덱스를 만들지 않도록 방지

enter image description here

내 질문 : EF6은 외래 키에 Non-Cluster index을 만들 수에 대한 전역 설정이 있습니까?

나는 검색하고 난 테이블을 많이 가지고 있기 때문에하지 말라고 맞는 내 db 이미 생성되어 다음과 같은 솔루션을

Solution 1: Remove index line from migration before updating database

해결 방법 1을 발견했다. 색인 생성 라인을 수동으로 제거하는 데 많은 시간이 필요합니다.

또한이 문제와 관련된 옵션은 fluent api입니다.

+0

첫째,이 문서를 살펴 // sqlskills. com/BLOGS/KIMBERLY/post/SQL-Server-stop-putting-foreign-key-columns.aspx) SQL 쿼리를 작성하여 마이그레이션에 실행할 수 있습니다. – Saeed

답변

2

나는 이것에 간단한 해결책이 있다고는 생각하지 않지만, 당신이 할 수있는 일에 대해 생각해 보았습니다 : 커스텀 마이그레이션 생성자를 만드십시오.

마이그레이션 생성기는 마이그레이션 코드 파일에서 데이터베이스에서 실행되는 SQL 스크립트를 만드는 구성 요소입니다. 스크린 샷을 기반으로 SQL Server가 있다고 가정합니다.

public class NoIndexGenerator : SqlServerMigrationSqlGenerator 
{ 
    protected override void Generate(CreateIndexOperation createIndexOperation) 
    { 
    if (!createIndexOperation.IsClustered) 
    { 
     return; 
    } 
    } 
} 

는 그런 다음에이 구성 요소를 등록해야합니다 :이 경우, 당신은 단순히 인덱스가 클러스터되지 않은 경우, 아무것도 스크립트에 기록되지 않도록 인덱스 생성 작업을 재정의하는 사용자 지정 SQL 생성기를 쓸 수 있습니다 마이그레이션의 Configuration 클래스 : 당신이 Add-Migration을 실행하면

internal sealed class Configuration : DbMigrationsConfiguration<MyCtx> 
{ 
    public Configuration() 
    { 
    AutomaticMigrationsEnabled = false; 

    // Add this line to register the sql generator 
    this.SetSqlGenerator("System.Data.SqlClient", new NoIndexGenerator()); 
    } 
} 

지금, 당신은 거기에 CreateIndexOperation으로, 일반 마이그레이션 파일을해야합니다. 그러나 Update-Database을 실행하면 클러스터되지 않은 인덱스가 만들어지지 않습니다. Update-Database -Script을 실행하면 이것을 확인할 수도 있습니다. 결과 스크립트에는 클러스터되지 않은 인덱스가 없습니다.

원하는 경우 파이프 라인에서 더 높은 곳으로 이동하여 사용자 지정 C# 마이그레이션 스캐 폴더를 만들 수 있습니다. 당신이 Add-Migration를 실행하는 경우 CreateIndex의 작업에서 사라집니다 지금

internal sealed class Configuration : DbMigrationsConfiguration<MyCtx> 
{ 
    public Configuration() 
    { 
    AutomaticMigrationsEnabled = false; 

    // Add this line to register the C# code generator 
    this.CodeGenerator = new NoIndexMigrationCodeGenerator(); 
    } 
} 

:이 같은 Configuration 클래스에 등록 할 수 있습니다, 그리고

internal class NoIndexMigrationCodeGenerator : CSharpMigrationCodeGenerator 
{ 
    protected override void Generate(CreateIndexOperation createIndexOperation, IndentedTextWriter writer) 
    { 
    if (!createIndexOperation.IsClustered) 
    { 
     return; 
    } 
    } 
} 

: 그것은 SQL 생성기와 같은 논리를 적용 생성 된 마이그레이션 cs 파일도 마찬가지입니다.

나는 두 번째 솔루션으로 갈 것입니다 (마이그레이션 cs 파일에는 CreateIndex 작업이 있지만 SQL 스크립트에는없는 코드를 읽는 것이 혼란 스러울 수 있지만 궁극적으로는 선택 사항입니다). :)

Generate() 메서드의 createIndexOperation 매개 변수의 다른 속성으로 재생하면보다 정교한 인덱스 필터링을 구현할 수 있습니다.

원하는 경우 매개 변수가 DropCreateIndexOperation 인 Generate 메서드를 재정의 할 수도 있지만 인덱스가 'drop-if-exists'패턴으로 삭제되기 때문에 이것이 필요하지 않다고 생각합니다.

+0

감사합니다 :) –

1

글쎄, 내 생각에 이것은 '네가 가진 모든 것은 망치 ...'라고 할 수있다.

나는 작품 전 (그리고 나는 그것에 의해 서있다, 왜냐하면 그것은 완전히 재미 있고 굉장하기 때문에) 대답은 그것을 할 수있는 최선의 방법은 아닐 것이다.

최근에 EF에서 데이터베이스 생성을 사용하는 모든 기본 규칙을 확인했으며 FK-s에서 클러스터되지 않은 색인을 생성하는 책임이 있습니다. 그냥 모두가 규칙을 제거하고 문제가 해결된다 : [? SQL 서버가 외부 키 컬럼에 인덱스를 넣어 중지 않은 경우 (HTTP :

모두의
protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 

    // using System.Data.Entity.ModelConfiguration.Conventions; 
    modelBuilder.Conventions.Remove<ForeignKeyIndexConvention>(); 
}