3

是否可以使用EF Code First Migrations的CreateIndex語法創建覆蓋索引(*請參閱下文了解覆蓋索引的含義)。EF代碼優先:CreateIndex - 覆蓋索引

例如,我可以在手動遷移創建一個簡單的指標,像這樣:

CreateIndex("RelatedProduct", "RelatedId"); 

它有一個名爲「匿名參數」的最終參數,指定它可以處理任何潛在的供應商支持 - 但它不是清楚我如何確定支持是什麼。這是可能的還是我需要訴諸平坦的SQL? *覆蓋索引是RDB在葉節點中存儲重複數據的地方,而不僅僅是指向主表的指針。它本質上是索引中列重新排序的表的重複,僅包含該類型搜索中最常用的列。

回答

7

我認爲覆蓋索引是涵蓋查詢的非聚集索引(所以它不需要任何額外的查找回到表)。您所描述的是這種索引的附加功能,它允許您在葉級別上包含不屬於索引鍵的數據。

CreateIndex現在不支持。您必須直接使用Sql,或者您可以檢查EF的源代碼,並在SQL生成器中將INCLUDE的支持添加到CreateIndex調用,CreateIndexOperation和相關的Generate方法中。

+0

是的,一個普通的醇」(非聚集)索引和覆蓋索引之間的差通常是一個索引不存儲數據,只是指向表的指針。覆蓋索引額外存儲一些列的副本。 http://stackoverflow.com/questions/609343/what-are-covering-indexes-and-covered-queries-in-sql-server在檢查源代碼時的良好調用,我會看看。 – 2013-02-15 01:19:53

+0

你是對的; anonymousArguments arg給了我希望,但是源代碼只是將它們存儲在一個Dictionary中,並且對它們不做任何事情 - 大概是將來的特性。它看起來合理地可能分叉源並且增加這個能力。 System.Data.Entity.Migrations.Sql.SqlServerMigrationSqlGenerator有一個保護虛擬無效生成(CreateIndexOperation createIndexOperation)的方法,該方法足以直接將其添加到。 – 2013-02-15 01:37:49

1

您不能使用CreateIndex調用來執行此操作,但您可以在不修改EF源的情況下從側面提供您自己的替代方法。其核心是在手動遷移的你的向上()方法發射原始SQL,等:

// Build a string like 
//@"create nonclustered index IX_IsPublished_OrderIndex 
//on Project (IsPublished desc, OrderIndex asc) 
//include [Key]" 
var sb = new StringBuilder(); 
sb.Append("create nonclustered index [") 
.Append(Name) 
.Append("] on [") 
.Append(Table) 
.Append("] (") 
.Append(String.Join(", ", Columns 
    .Select(col => "[" + col.Name + "] " + (col.IsAsc ? "asc" : "desc")) 
)) 
.Append(")"); 

if (Include != null && Include.Length > 0) 
{ 
    sb.Append(" include (") 
    .Append(String.Join(", ", Include.Select(c => "[" + c + "]"))) 
    .Append(")"); 
}