有没有办法让EF CTP5在创建模式时创建索引?
Mor*_*avi 31
您可以在Database类上利用新的CTP5的ExecuteSqlCommand方法,该方法允许对数据库执行原始SQL命令.
为此目的调用SqlCommand方法的最佳位置是在自定义Initializer类中重写的Seed方法内.例如:
protected override void Seed(EntityMappingContext context)
{
context.Database.ExecuteSqlCommand("CREATE INDEX IX_NAME ON ...");
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*inF 17
正如Mortezas的评论中提到的那样,如果您使用迁移,则会有一个CreateIndex/DropIndex方法.
但是,如果您处于"调试"/开发模式并且一直在更改模式,并且每次都可以使用Morteza中提到的示例来重新创建数据库.
为了使它更容易一点,我写了一个非常简单的扩展方法,使其强烈打字,作为灵感,我想与任何读这个问题的人分享,也许也想要这种方法.只需更改它以适合您的需求和命名索引的方式.
You use it like this: context.Database.CreateUniqueIndex<User>(x => x.Name);
Run Code Online (Sandbox Code Playgroud)
.
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;
}
Run Code Online (Sandbox Code Playgroud)
更新:从版本6.1开始,可以使用[Index]属性.
有关详细信息,请参阅http://msdn.microsoft.com/en-US/data/jj591583#Index
| 归档时间: |
|
| 查看次数: |
19501 次 |
| 最近记录: |