说我有以下型号:
[Table("Record")] public class RecordModel { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] [Display(Name = "Record Id")] public int RecordId { get; set; } [StringLength(150)] public string Name { get; set; } [required] [StringLength(15)] public string IMEI { get; set; } }
解决方法
根据这个链接:
Creating Indexes via Data Annotations with Entity Framework 5.0
你应该写一些类型的扩展代码:
你应该写一些类型的扩展代码:
using System; [AttributeUsage(AttributeTargets.Property,Inherited = false,AllowMultiple = true)] public class IndexAttribute : Attribute { public IndexAttribute(string name,bool unique = false) { this.Name = name; this.IsUnique = unique; } public string Name { get; private set; } public bool IsUnique { get; private set; } }
和第二类:
using System.ComponentModel.DataAnnotations.Schema; using System.Data.Entity; using System.Linq; using System.Reflection; public class IndexInitializer<T> : IDatabaseInitializer<T> where T : DbContext { private const string CreateIndexQueryTemplate = "CREATE {unique} INDEX {indexName} ON {tableName} ({columnName})"; public void InitializeDatabase(T context) { const BindingFlags PublicInstance = BindingFlags.Public | BindingFlags.Instance; foreach (var dataSetProperty in typeof(T).GetProperties(PublicInstance).Where( p => p.PropertyType.Name == typeof(DbSet<>).Name)) { var entityType = dataSetProperty.PropertyType.GetGenericArguments().Single(); TableAttribute[] tableAttributes = (TableAttribute[])entityType.GetCustomAttributes(typeof(TableAttribute),false); foreach (var property in entityType.GetProperties(PublicInstance)) { IndexAttribute[] indexAttributes = (IndexAttribute[])property.GetCustomAttributes(typeof(IndexAttribute),false); NotMappedAttribute[] notMappedAttributes = (NotMappedAttribute[])property.GetCustomAttributes(typeof(NotMappedAttribute),false); if (indexAttributes.Length > 0 && notMappedAttributes.Length == 0) { ColumnAttribute[] columnAttributes = (ColumnAttribute[])property.GetCustomAttributes(typeof(ColumnAttribute),false); foreach (var indexAttribute in indexAttributes) { string indexName = indexAttribute.Name; string tableName = tableAttributes.Length != 0 ? tableAttributes[0].Name : dataSetProperty.Name; string columnName = columnAttributes.Length != 0 ? columnAttributes[0].Name : property.Name; string query = CreateIndexQueryTemplate.Replace("{indexName}",indexName) .Replace("{tableName}",tableName) .Replace("{columnName}",columnName) .Replace("{unique}",indexAttribute.IsUnique ? "UNIQUE" : string.Empty); context.Database.CreateIfNotExists(); context.Database.ExecutesqlCommand(query); } } } } } }
之后,您可以使用您的索引:
[required] [Index("IMEIIndex",unique: true)] [StringLength(15)] public string IMEI { get; set; }