.NET 4 ADO.NET Entity의 SQL 생성기가 특정 열의 인덱스를 만들도록 지시하는 방법이 있습니까?인덱스가있는 Entity Framework 코드 생성
답변
인덱스는 기본적으로 지원되지 않지만 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");
희망하는 데 도움이! 얼룩의 답변을 보완
아주 좋은 대답, 감사합니다 – Francisco
, 예를 들어 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#>]);
<#
}
}
#>
- 1. Entity Framework 4 POCO 생성
- 2. Entity Framework 4.1을 사용하여 출력 SQL 생성 코드 우선
- 3. Entity Framework 일대 다 관계 코드 우선
- 4. Entity Framework v4 코드 전용 연결 문자열
- 5. POCO 대 Entity Framework 생성 클래스?
- 6. Entity Framework 4.1 동적으로 생성 된 테이블
- 7. 탐색 속성없이 DB에서 Entity Framework 모델 생성
- 8. Entity Framework DataContexts
- 9. Entity Framework 4.1 코드 우선 TPC 문제
- 10. Entity Framework 코드 우선 엔터티마다 스키마 구성
- 11. Entity Framework 용 CodeSmith 템플릿 코드
- 12. Entity Framework 코드 첫 번째 CTP5 매핑
- 13. Entity Framework, 코드 전용 및 EntityDataSource
- 14. Entity Framework 코드 첫 번째 및 관계
- 15. Entity Framework 코드 First Insert 메서드 후크
- 16. Entity Framework 코드 첫 번째 매핑
- 17. Entity Framework 코드 우선 계산 된 속성
- 18. Entity Framework 코드 첫 번째 프리미티브 컬렉션
- 19. MembershipUser 및 Entity Framework 코드 우선
- 20. Lucene.net과 Entity Framework 4
- 21. IOC with Entity Framework
- 22. Entity Framework 스레드 보안
- 23. Entity Framework 코드를 먼저 배포하십시오.
- 24. Entity Framework 데이터베이스의 코드 첫 번째 기본 데이터
- 25. Entity Framework 쿼리 도움말
- 26. ADO.Net Entity Framework/Linq
- 27. Entity Framework 및 DataNavigator
- 28. Entity Framework - 개체 속성
- 29. Entity Framework T4 템플릿이있는 이상한 버그 - 새 코드 파일 만들기
- 30. Entity Framework : 관리 사이트 생성기
@Andomar. 죄송합니다. 귀하의 의견이 현재의 양식에 특히 유용하다고 생각하지 않습니다.아마도 당신은 조금 설명하고 진술과 견해를 정당화 할 수 있습니다. Jameszhao00은 기술 선택을 할 수있는 위치에 있지 않을 수도 있지만 엔티티 프레임 워크를 사용하여 기존 시스템에서 특정 목표를 달성하기 위해 노력할 수도 있습니다. 내가 당신과 완전히 동의하지 않는 것은 아니지만 상황이 중요하다고 생각합니다. –