说我有以下型号:
[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; } }
通过使用属性,数据注释或模型中的某些东西,可以向IMEI列添加索引吗?
解决方法
根据这个链接:
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; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。