如何在代码优先的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 });