一直用EF Fluent Api 作MapConfiguration數據庫
因此遇到了惟一約束這個瓶頸ide
使用惟一約束的兩種方式:ui
方式1 自定義惟一約束spa
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] public class UniqueAttribute : ValidationAttribute { public override Boolean IsValid(Object value) { //校驗數據庫是否存在當前Key return true; } }
在Model類中使用3d
public class Email { [Key] public int EmailID { get; set; } public int PersonId { get; set; } [Unique] [Required] [MaxLength(100)] public string EmailAddress { get; set; } public virtual bool IsDefault { get; set; } public virtual Boolean IsApprovedForLogin { get; set; } public virtual String ConfirmationToken { get; set; } [ForeignKey("PersonId")] public virtual Person Person { get; set; } }
方式2 擴展DataBaseSetInitializer 使用Sql語句添加
public class MyInitializer : CreateDatabaseIfNotExists<MyContext> { protected override void Seed(MyContext context) { context.Database.ExecuteSqlCommand("CREATE UNIQUE INDEX IX_Category_Title ON Categories (Title)"); } }
在DbContext中使用
Database.SetInitializer<MyContext>(new MyInitializer());
方式3 擴展IDatabaseInitializer
public class Initializer : IDatabaseInitializer<myEntities> { public void InitializeDatabase(myEntities context) { if (System.Diagnostics.Debugger.IsAttached && context.Database.Exists() && !context.Database.CompatibleWithModel(false)) { context.Database.Delete(); } if (!context.Database.Exists()) { context.Database.Create(); var contextObject = context as System.Object; var contextType = contextObject.GetType(); var properties = contextType.GetProperties(); System.Type t = null; string tableName = null; string fieldName = null; foreach (var pi in properties) { if (pi.PropertyType.IsGenericType && pi.PropertyType.Name.Contains("DbSet")) { t = pi.PropertyType.GetGenericArguments()[0]; var mytableName = t.GetCustomAttributes(typeof(TableAttribute), true); if (mytableName.Length > 0) { TableAttribute mytable = mytableName[0] as TableAttribute; tableName = mytable.Name; } else { tableName = pi.Name; } foreach (var piEntity in t.GetProperties()) { if (piEntity.GetCustomAttributes(typeof(UniqueAttribute), true).Length > 0) { fieldName = piEntity.Name; context.Database.ExecuteSqlCommand("ALTER TABLE " + tableName + " ADD CONSTRAINT con_Unique_" + tableName + "_" + fieldName + " UNIQUE (" + fieldName + ")"); } } } } } } }
在DbContext中使用
System.Data.Entity.Database.SetInitializer<MyApp.Models.DomainModels.myEntities>(new MyApp.Models.DomainModels.myEntities.Initializer());
參考文獻:http://stackoverflow.com/questions/5701608/unique-key-with-ef-code-first