流氓の影

一个在学习泥潭中越陷越深的码畜

 

如何在EF CodeFirst中使用唯一约束(Unique)

一直用EF Fluent Api 做MapConfiguration

所以遇到了唯一约束这个瓶颈

 

使用唯一约束的两种方式:

 

方式1 自定义唯一约束

 

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class UniqueAttribute : ValidationAttribute
{
   public override Boolean IsValid(Object value)
    {
        //校验数据库是否存在当前Key
        return true;
    }
}
View Code

 

在Model类中使用

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; }
}
View Code

 



方式2 扩展DataBase
SetInitializer 使用Sql语句添加
public class MyInitializer : CreateDatabaseIfNotExists<MyContext>
{
  protected override void Seed(MyContext context)
  {
    context.Database.ExecuteSqlCommand("CREATE UNIQUE INDEX IX_Category_Title ON Categories (Title)");
  }
}
View Code

 


在DbContext中使用
Database.SetInitializer<MyContext>(new MyInitializer());
View Code

 



方式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 + ")");
                                }
                            }
                        }
                    }
                }
            }
        }
View Code

在DbContext中使用
System.Data.Entity.Database.SetInitializer<MyApp.Models.DomainModels.myEntities>(new MyApp.Models.DomainModels.myEntities.Initializer());
View Code

 




参考文献:http://stackoverflow.com/questions/5701608/unique-key-with-ef-code-first
 

posted on 2013-09-09 18:52  Manon_Loki  阅读(...)  评论(...编辑  收藏

导航

统计