回答
您可以採取數據庫類,它允許對數據庫執行原始的SQL命令,利用新CTP5的ExecuteSqlCommand方法。
爲此目的而調用SqlCommand方法的最佳位置是在自定義初始化程序類中覆蓋的Seed方法內。例如:
protected override void Seed(EntityMappingContext context)
{
context.Database.ExecuteSqlCommand("CREATE INDEX IX_NAME ON ...");
}
真是個好主意!那麼我認爲除此之外還沒有內置的支持? – 2011-02-14 18:53:15
正如一些評論,以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
此功能應通過數據註釋和流利的API,在不久的將來推出。微軟增加了它納入其積壓:
http://entityframework.codeplex.com/workitem/list/basic?keywords=DevDiv [Id=87553]
在那之前,你需要一個自定義使用種子法初始化器類執行SQL創建唯一索引,如果你是使用代碼優先遷移,創建新的遷移以添加唯一索引,並在您的Up
和Down
方法中使用CreateIndex
和DropIndex
方法進行遷移以創建和刪除索引。
這裏檢查我的答案Entity Framework Code First Fluent Api: Adding Indexes to columns這允許您通過使用屬性屬性來定義多列索引。
- 1. 實體框架代碼首先,聚集索引和組合鍵
- 2. 實體框架代碼首先 - 索引屬性不受支持
- 3. 實體框架代碼首先愁楚
- 4. 使用實體框架代碼首先
- 5. 實體框架代碼首先FK場
- 6. 與實體框架代碼首先
- 7. 變化實體框架代碼首先
- 8. 實體框架代碼首先+ MySQL ... NullReferenceException
- 9. 實體框架使用代碼首先
- 10. 在實體框架代碼首先
- 11. 部署實體框架代碼首先
- 12. 我在實體框架代碼首先
- 13. 「update-database」實體框架代碼首先不再添加表格
- 14. 在實體框架代碼中檢索子記錄首先
- 15. 實體框架CTP5
- 16. 實體框架代碼中的繼承代碼首先
- 17. 實體框架代碼首先刪除實體沒有父
- 18. 實體框架代碼首先,指向實體
- 19. 實體框架代碼保存後首先不延遲加載
- 20. 實體框架代碼首先查找與SingleOrDefault(渴望加載)
- 21. 實體框架代碼首先對僞索引使用存儲過程?
- 22. 實體框架代碼首先,通過「先典」更新父
- 23. 從實體框架模型首先切換到代碼優先
- 24. 實體框架代碼第一個外鍵添加索引
- 25. 首先在實體框架代碼中實現數據驗證
- 26. 實體框架代碼優先:如何指定索引名稱
- 27. 實體框架代碼首先配置每個實體的架構
- 28. 實體框架中添加欄6.1 - 許多一對多 - 代碼首先
- 29. 使用實體框架添加數據庫觸發器代碼首先遷移
- 30. 實體框架代碼首先從其他項目添加模型
您可以在此投票選擇此功能:http://connect.microsoft.com/VisualStudio/feedback/details/624575/index-attribute-in-ef-code-first – 2011-12-09 13:07:18
@ vasek7:MS迴應並說您應該在這裏投票,而不是:http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/2231176-indexattribute(我加我的+3) – mpen 2012-04-15 22:29:46
看到解決方案在這裏:http://stackoverflow.com/a/23055838/187650 – juFo 2014-07-20 17:44:09