Y at-il un moyen d'obtenir EF CTP5 pour créer un index quand il crée un schéma?
Mise à jour: Voir ici pour la façon dont EF 6.1 gère cela (comme indiqué par juFo ci-dessous).
Vous pouvez profiter de la nouvelle méthode ExecuteSqlCommand du CTP5 sur la classe Database qui permet d'exécuter des commandes SQL brutes contre la base de données.
Le meilleur endroit pour invoquer la méthode SqlCommand à cette fin est à l'intérieur d'une méthode de semence qui a été remplacé dans une classe Initializer personnalisé. Par exemple :
Comme certains mentionné dans les commentaires de Mortezas réponse il existe une CreateIndex/DropIndex méthode si vous utilisez des migrations.
Mais si vous êtes en "debug"/mode de développement et est en train de changer le schéma de tous les temps et de recréer la base de données chaque fois que vous pouvez utiliser l'exemple mentionné dans Morteza réponse.
Pour le rendre un peu plus facile, j'ai écrit une extension très simple méthode pour rendre fortement typé, comme source d'inspiration que je veux partager avec quiconque lit cette question et peut-être voudrais cette approche aswell. Il suffit de changer pour l'adapter à vos besoins et à votre façon de nommer les indices.
You use it like this: context.Database.CreateUniqueIndex<User>(x => x.Name);
.
public static void CreateUniqueIndex<TModel>(this Database database, Expression<Func<TModel, object>> expression)
{
if (database == null)
throw new ArgumentNullException("database");
// Assumes singular table name matching the name of the Model type
var tableName = typeof(TModel).Name;
var columnName = GetLambdaExpressionName(expression.Body);
var indexName = string.Format("IX_{0}_{1}", tableName, columnName);
var createIndexSql = string.Format("CREATE UNIQUE INDEX {0} ON {1} ({2})", indexName, tableName, columnName);
database.ExecuteSqlCommand(createIndexSql);
}
public static string GetLambdaExpressionName(Expression expression)
{
MemberExpression memberExp = expression as MemberExpression;
if (memberExp == null)
{
// Check if it is an UnaryExpression and unwrap it
var unaryExp = expression as UnaryExpression;
if (unaryExp != null)
memberExp = unaryExp.Operand as MemberExpression;
}
if (memberExp == null)
throw new ArgumentException("Cannot get name from expression", "expression");
return memberExp.Member.Name;
}
Mise à jour: à Partir de la version 6.1 et au-delà il y a un [Index] attribut disponible.
Pour plus d'info, voir http://msdn.microsoft.com/en-US/data/jj591583#Index
Cette fonctionnalité devrait être disponible dans le proche avenir, par le biais des données d'annotations et de l'API Fluent. Microsoft ont ajouté dans leur carnet de commandes publiques:
http://entityframework.codeplex.com/workitem/list/basic?keywords=DevDiv [Id=87553]
D'ici là, vous aurez besoin d'utiliser une semence de la méthode sur une coutume de l'Initialiseur de la classe à exécuter le SQL pour créer l'index unique, et si vous êtes à l'aide de code-première des migrations, de créer une nouvelle migration pour l'ajout de l'index unique, et l'utilisation de l' CreateIndex
et DropIndex
méthodes dans votre Up
et Down
méthodes pour la migration de créer et de supprimer l'index.
Vérifiez ma réponse ici Entity Framework Code First Fluent Api: Ajout d'index aux colonnes, ce qui vous permet de définir des index multi colonnes en utilisant des attributs sur les propriétés.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.