Есть ли способ получить EF CTP5 для создания индекса при создании схемы?
Обновление: Смотрите здесь, как это делает EF 6.1 (как указано juFo ниже.)
Есть ли способ получить EF CTP5 для создания индекса при создании схемы?
Обновление: Смотрите здесь, как это делает EF 6.1 (как указано juFo ниже.)
Вы можете использовать новый метод ExecuteSqlCommand CTP5s в классе Database, который позволяет выполнять необработанные команды SQL в отношении базы данных.
Лучшим местом для вызова метода SqlCommand для этой цели является метод Seed, который был переопределен в пользовательском классе Initializer. Например:
protected override void Seed(EntityMappingContext context)
{
context.Database.ExecuteSqlCommand("CREATE INDEX IX_NAME ON ...");
}
Как упоминалось в комментариях к Мортезасу, существует ответ на метод CreateIndex/DropIndex, если вы используете миграции.
Но если вы находитесь в режиме "debug" /development и постоянно меняете схему и воссоздаете базу данных каждый раз, когда можете использовать пример, упомянутый в Morteza.
Чтобы сделать это немного проще, я написал очень простой метод расширения, чтобы сделать его строго типизированным, как вдохновение, которое я хочу поделиться с любым, кто читает этот вопрос, и, возможно, тоже хотел бы использовать этот подход. Просто измените его, чтобы он соответствовал вашим потребностям и способу именования индексов.
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;
}
Обновление. Начиная с версии 6.1 и далее доступен атрибут [Index].
Для получения дополнительной информации см. http://msdn.microsoft.com/en-US/data/jj591583#Index
Эта функция должна быть доступна в ближайшем будущем через аннотации данных и Fluent API. Microsoft добавила его в свой общий журнал:
http://entityframework.codeplex.com/workitem/list/basic?keywords=DevDiv [Id = 87553]
До тех пор вам понадобится использовать метод seed в пользовательском классе Initializer для выполнения SQL для создания уникального индекса, а если вы используете первые миграции кода, создайте новую миграцию для добавления уникального индекса, и используйте методы CreateIndex
и DropIndex
в ваших методах Up
и Down
для миграции для создания и удаления индекса.
Проверьте мой ответ здесь Код Entity Framework First Fluent Api: добавление индексов в столбцы, это позволяет вам определять индексы с несколькими столбцами, используя атрибуты свойств.