如何在代码优先的entity framework6.2中创build索引

有没有办法使用代码优先在属性/列上创build索引,而不是使用新的IndexAttribute

26.10.2017entity framework6.2 正式发布 。 它包括通过Fluent API轻松定义索引的可能性 。 何用是在6.2的beta版中已经公布的。

现在,您可以使用HasIndex()方法,然后使用HasIndex() IsUnique()如果它应该是唯一索引)。

只是一个比较(之前/之后)的例子:

 // before modelBuilder.Entity<Person>() .Property(e => e.Name) .HasColumnAnnotation( IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute { IsUnique = true })); // after modelBuilder.Entity<Person>() .HasIndex(p => p.Name) .IsUnique(); // multi column index modelBuilder.Entity<Person>() .HasIndex(p => new { p.Name, p.Firstname }) .IsUnique(); 

也可以使用.IsClustered()将索引标记为聚簇。

编辑

添加了多列索引的示例以及如何将索引标记为聚集的附加信息。

目前没有通过stream畅API创build索引的“一stream支持” ,但是您可以通过stream畅的API将属性标记为具有Annotation API的属性。 这将允许您通过stream畅的界面添加Index属性。

以下是来自EF问题站点工作项目的一些示例。

在单个列上创build一个索引:

 modelBuilder.Entity<MyEntity>() .Property(e => e.MyProperty) .HasColumnAnnotation( IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute())); 

单列上的多个索引:

 modelBuilder.Entity<MyEntity>() .Property(e => e.MyProperty) .HasColumnAnnotation( IndexAnnotation.AnnotationName, new IndexAnnotation(new[] { new IndexAttribute("Index1"), new IndexAttribute("Index2") { IsUnique = true } })); 

多列索引:

 modelBuilder.Entity<MyEntity>() .Property(e => e.MyProperty1) .HasColumnAnnotation( IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute("MyIndex", 1))); modelBuilder.Entity<MyEntity>() .Property(e => e.MyProperty2) .HasColumnAnnotation( IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute("MyIndex", 2))); 

使用上述技术将会在您的下一次迁移脚手架时(或者如果您未使用迁移,在数据库中自动创buildUp()在您的Up()函数中为您自动创build.CreateIndex()调用。

我创build了一些扩展方法,并将它们包装在一个nuget包中以使这更容易。

安装EntityFramework.IndexingExtensions nuget包。

然后你可以做到以下几点:

 public class MyDataContext : DbContext { protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Customer>() .HasIndex("IX_Customers_Name", // Provide the index name. e => e.Property(x => x.LastName), // Specify at least one column. e => e.Property(x => x.FirstName)) // Multiple columns as desired. .HasIndex("IX_Customers_EmailAddress", // Supports fluent chaining for more indexes. IndexOptions.Unique, // Supports flags for unique and clustered. e => e.Property(x => x.EmailAddress)); } } 

项目和源代码在这里 。 请享用!

没有明确的名字:

 [Index] public int Rating { get; set; } 

用一个特定的名字:

 [Index("PostRatingIndex")] public int Rating { get; set; } 

entity framework6

 Property(c => c.MyColumn) .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_MyIndex"))); 

并添加使用:

 using System.Data.Entity.Infrastructure.Annotations; using System.ComponentModel.DataAnnotations.Schema; 

从EF 6.1开始,支持属性[Index]
使用[Index(IsUnique = true)]作为唯一索引。
这里是微软的链接

 public class User { public int UserId { get; set; } [Index(IsUnique = true)] [StringLength(200)] public string Username { get; set; } public string DisplayName { get; set; } } 

您可以使用INDEX数据注释Code First Data Annotations

如果你不想在你的POCO上使用属性,那么你总是可以像下面这样做:

 context.Database.ExecuteSqlCommand("CREATE INDEX IX_NAME ON ..."); 

您可以在自定义DbInitializer派生类中执行此语句。 我不知道这样做的任何stream利的API方式。

我写了一个在stream利EF中使用的扩展方法,以避免额外的代码:

 public static PrimitivePropertyConfiguration HasIndexAnnotation( this PrimitivePropertyConfiguration primitivePropertyConfiguration, IndexAttribute indexAttribute = null ) { indexAttribute = indexAttribute ?? new IndexAttribute(); return primitivePropertyConfiguration .HasColumnAnnotation( IndexAnnotation.AnnotationName, new IndexAnnotation(indexAttribute) ); } 

然后像这样使用它:

 Property(t => t.CardNo) .HasIndexAnnotation(); 

或者像这样如果索引需要一些configuration:

 Property(t => t.CardNo) .HasIndexAnnotation(new IndexAttribute("IX_Account") { IsUnique = true });