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

 我来答
匿名用户
推荐于2016-03-10
展开全部
  定义唯一约束

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

  在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; }
  }

  方式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());
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式