2010-02-21 5 views
1

.NET 4 ADO.NET Entity의 SQL 생성기가 특정 열의 인덱스를 만들도록 지시하는 방법이 있습니까?인덱스가있는 Entity Framework 코드 생성

+8

@Andomar. 죄송합니다. 귀하의 의견이 현재의 양식에 특히 유용하다고 생각하지 않습니다.아마도 당신은 조금 설명하고 진술과 견해를 정당화 할 수 있습니다. Jameszhao00은 기술 선택을 할 수있는 위치에 있지 않을 수도 있지만 엔티티 프레임 워크를 사용하여 기존 시스템에서 특정 목표를 달성하기 위해 노력할 수도 있습니다. 내가 당신과 완전히 동의하지 않는 것은 아니지만 상황이 중요하다고 생각합니다. –

답변

1

인덱스는 기본적으로 지원되지 않지만 this 문서의 "DDL 생성 영향"섹션에서이 사용자 지정 기능을 기존 템플릿에 추가하는 방법을 알 수 있습니다. 기사의 예에서

, 당신의 EDMX의 CSDL에서 새 인덱스는 다음과 같이 보일 것입니다 :

<Property ... > 
    <myExtensions:Index indexName="Seat" edmx:CopyToSSDL="true"/> 
</Property> 

하지만 몇 가지를 수정해야 할 작업이를 얻을 수 (나는에 제공된 링크를 참조 세부).

마이크로 소프트 비주얼 스튜디오 \ 10.0 \ : 당신이에서 발견 된 템플릿을 수정해야 할 것, 둘째

<!-- CSDL content --> 
<edmx:ConceptualModels> 
    <Schema [...] xmlns:myExtensions="http://www.microsoft.com/userExtensions"> 
    [...] 
</edmx> 

: 첫째, 당신은 스키마 노드에서 그 "myExtensions"네임 스페이스를 선언해야 할 것 Common7 \ IDE \ 확장 \ 솔루션은 Linq에 필요하므로 템플릿의 상단이 추가 DBGen \ SSDLToSQL10.tt

\ 마이크로 소프트 \ 엔티티 프레임 워크 도구 :

<#@ assembly name="System.Xml.Linq" #> 

그리고 바닥이 추가 : 그 대부분은 아주 쉽게 당신의 요구에 맞게 수정할 수

-- Creating index for table based on custom extensions -- 
<# 
    foreach (EntitySet entitySet in Store.GetAllEntitySets()) 
    { 
    string tableName = Id(entitySet.GetTableName()); 
    string schemaName = Id(entitySet.GetSchemaName()); 
    EdmProperties props = entitySet.ElementType.Properties; 
    foreach (EdmProperty ep in props.Where(p => 
          p.TypeUsage.EdmType is PrimitiveType)) 
    { 
     MetadataProperty meta = ep.MetadataProperties.FirstOrDefault(mp => mp.Name == "http://www.microsoft.com/userExtensions:Index"); 
     if (meta != null) 
     { 
      System.Xml.Linq.XElement e = meta.Value as System.Xml.Linq.XElement; 
      System.Xml.Linq.XAttribute attr = e.Attributes().FirstOrDefault(a => a.Name == "indexName"); 
      string indexName = attr.Value;  
      // create an index for specified column 
#> 
CREATE INDEX [IX_<#=indexName#>] 
ON <#if (!IsSQLCE) {#>[<#=schemaName#>].<#}#>[<#=tableName#>] 
([<#=indexName#>]); 
<# 
     } 
    } 
    } 
#> 

. 이 기사는 세부 사항을 더 들어가는하지만, 위의 코드에서 가장 중요한 라인은 사용자 정의 "인덱스"확장 노드 것을 가져 오는 하나입니다 :

MetadataProperty meta = ep.MetadataProperties.FirstOrDefault(mp => mp.Name == "http://www.microsoft.com/userExtensions:Index"); 

희망하는 데 도움이! 얼룩의 답변을 보완

+0

아주 좋은 대답, 감사합니다 – Francisco

0

, 예를 들어 5

EF에서 일이 위해 수행해야 할 몇 가지 트릭이있다, edmx는 : CopyToSSDL는 = "true"로 바로 박쥐 작동하지 않습니다. 당신은 몇 가지 해킹을 할 필요가 :

<Schema xmlns="http://schemas.microsoft.com/ado/2009/11/edm" xmlns:cg="http://schemas.microsoft.com/ado/2006/04/codegeneration" 
       xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" Namespace="CPEData" Alias="Self" 
       xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" annotation:UseStrongSpatialTypes="false" 
       xmlns:myExtensions="http://www.microsoft.com/userExtensions" 
       xmlns:edmxv2="http://schemas.microsoft.com/ado/2008/10/edmx" > 

그리고 사용자 정의 속성 (차리는 edmxv2) :

<myExtensions:Index edmxv2:CopyToSSDL="true" IndexName="Name" Columns="Name" > 

더 많은 정보를 원하시면 this link를 참조하십시오.

또한 T4 코드를 좀 더 쉽게 변경했습니다. 보다 유연한 사용자 정의 요소 구문을 수행하기 위해 작업 영역으로 this example을 사용했습니다.

<myExtensions:Index edmxv2:CopyToSSDL="true" IndexName="Name" Columns="Name" > 
    Custom metadata (not needed) 
</myExtensions:Index> 

을 그리고 다음 .TT 템플릿을 수정 :

당신은 (당신이 <Property></Property> 태그 안에 넣어 필요가 없습니다) 인스턴스에 대한 EntityType 요소의 끝에서 사용자 정의 요소를 추가 할 수

-- -------------------------------------------------- 
-- Creating all Indexes based on custom extensions 
-- -------------------------------------------------- 

<# 
    foreach (EntitySet entitySet in Store.GetAllEntitySets()) 
    { 
    string tableName = Id(entitySet.GetTableName()); 
    string schemaName = Id(entitySet.GetSchemaName()); 
    var props = entitySet.ElementType.MetadataProperties.Where(p => p.Name == "http://www.microsoft.com/userExtensions:Index"); 
    foreach (MetadataProperty meta in props) 
    { 
     System.Xml.Linq.XElement e = meta.Value as System.Xml.Linq.XElement; 
     string indexName = e.Attributes().FirstOrDefault(a => a.Name == "IndexName").Value; 
     string columnsName = e.Attributes().FirstOrDefault(a => a.Name == "Columns").Value; 
     // create an index for specified column 
#> 
CREATE INDEX [IX_<#=indexName#>] 
ON <#if (!IsSQLCE) {#>[<#=schemaName#>].<#}#>[<#=tableName#>] 
([<#=columnsName#>]); 
<# 

    } 
    } 
#> 
관련 문제