【发布时间】:2011-06-27 02:36:22
【问题描述】:
【问题讨论】:
-
@vasek7:MS 回复说你应该在这里投票:data.uservoice.com/forums/…(我添加了我的 +3)
-
在此处查看解决方案:stackoverflow.com/a/23055838/187650
标签: entity-framework
【问题讨论】:
标签: entity-framework
正如一些人在对 Mortezas 的回答中提到的那样,如果您使用迁移,则有一个 CreateIndex/DropIndex 方法。
但是,如果您处于“调试”/开发模式并且一直在更改架构并且每次都在重新创建数据库,那么您可以使用 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
【讨论】:
[Index("IX_BlogIdAndRating" /*use the same name for all properties*/, 2 /*change the number for each property*/)]
在这里查看我的答案Entity Framework Code First Fluent Api: Adding Indexes to columns 这允许您通过使用属性上的属性来定义多列索引。
【讨论】:
该功能应该在不久的将来通过数据注释和 Fluent API 提供。微软已将其添加到他们的公开积压中:
http://entityframework.codeplex.com/workitem/list/basic?keywords=DevDiv [Id=87553]
在此之前,您需要在自定义 Initializer 类上使用种子方法来执行 SQL 以创建唯一索引,如果您使用的是代码优先迁移,请创建一个新迁移以添加唯一索引,并使用 Up 和 Down 迁移方法中的 CreateIndex 和 DropIndex 方法来创建和删除索引。
【讨论】:
您可以利用 Database 类上的新 CTP5 的 ExecuteSqlCommand 方法,该方法允许对数据库执行原始 SQL 命令。
为此目的调用 SqlCommand 方法的最佳位置是在自定义 Initializer 类中已被覆盖的 Seed 方法内。例如:
protected override void Seed(EntityMappingContext context)
{
context.Database.ExecuteSqlCommand("CREATE INDEX IX_NAME ON ...");
}
【讨论】:
CreateIndex 的函数——我们不需要编写任何原始 SQL。