2011-02-14 74 views
30

有沒有辦法讓EF CTP5在創建一個模式時創建一個索引?首先添加帶實體框架代碼的索引(CTP5)

更新:請參閱here瞭解EF 6.1如何處理此問題(如下面的juFo所指出的那樣)。

+1

您可以在此投票選擇此功能:http://connect.microsoft.com/VisualStudio/feedback/details/624575/index-attribute-in-ef-code-first – 2011-12-09 13:07:18

+2

@ vasek7:MS迴應並說您應該在這裏投票,而不是:http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/2231176-indexattribute(我加我的+3) – mpen 2012-04-15 22:29:46

+0

看到解決方案在這裏:http://stackoverflow.com/a/23055838/187650 – juFo 2014-07-20 17:44:09

回答

31

您可以採取數據庫類,它允許對數據庫執行原始的SQL命令,利用新CTP5的ExecuteSqlCommand方法。

爲此目的而調用SqlCommand方法的最佳位置是在自定義初始化程序類中覆蓋的Seed方法內。例如:

protected override void Seed(EntityMappingContext context) 
{ 
    context.Database.ExecuteSqlCommand("CREATE INDEX IX_NAME ON ..."); 
} 
+0

真是個好主意!那麼我認爲除此之外還沒有內置的支持? – 2011-02-14 18:53:15

17

正如一些評論,以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版本及以後有一個[索引]屬性可用。

欲瞭解更多信息,請參閱http://msdn.microsoft.com/en-US/data/jj591583#Index

2

此功能應通過數據註釋和流利的API,在不久的將來推出。微軟增加了它納入其積壓:

http://entityframework.codeplex.com/workitem/list/basic?keywords=DevDiv [Id=87553]

在那之前,你需要一個自定義使用種子法初始化器類執行SQL創建唯一索引,如果你是使用代碼優先遷移,創建新的遷移以添加唯一索引,並在您的UpDown方法中使用CreateIndexDropIndex方法進行遷移以創建和刪除索引。

相關問題