Индексы изначально не поддерживаются, но если вы перейдете к разделу «Влияние на генерацию DDL» в этой статье , вы сможете увидеть, как добавить эти пользовательские функции в существующий шаблон.
В примере статьи новый индекс в CSDL вашего EDMX будет выглядеть примерно так:
<Property ... >
<myExtensions:Index indexName="Seat" edmx:CopyToSSDL="true"/>
</Property>
Но чтобы это работало, вам нужно изменить несколько вещей (подробности см. По ссылке, которую я предоставил). Во-первых, вам нужно объявить это пространство имен «myExtensions» на узле схемы:
<!-- CSDL content -->
<edmx:ConceptualModels>
<Schema [...] xmlns:myExtensions="http://www.microsoft.com/userExtensions">
[...]
</edmx>
Во-вторых, вам нужно изменить шаблон, найденный по адресу:
\ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ Extensions \ Microsoft \ Инструменты Entity Framework \ DBGen \ SSDLToSQL10.tt
Для решения требуется Linq, поэтому добавьте это в начало шаблона:
<#@ 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");
Надеюсь, это поможет!