【问题标题】:Unique Constraint with Entity Framework using Code First Migrations使用 Code First 迁移的实体框架的唯一约束
【发布时间】:2012-10-15 17:53:26
【问题描述】:

我正在 MVC 4 应用程序上进行实体框架 (v 5) 代码优先迁移。我想在数据库级别添加一个唯一约束。

我知道创建表时可以这样做,但我已经有一个表。 http://msdn.microsoft.com/en-US/data/jj591621

我尝试了以下,标记为答案:Unique constraint with EFCodeFirst and SqlCe4

我的数据库上下文略有不同,我提供的连接名称如下

public AppDatabaseContext() : base("MyConnectionDBContext")

当我使用包管理控制台更新数据库时,没有调用覆盖的种子方法:

protected override void Seed(AppDatabaseContext context)

我还尝试了以下方法:http://romiller.com/2010/07/31/ef-ctp4-tips-tricks-running-additional-ddl/

我没有使用嵌套类,这是因为我似乎必须通过 app.config 注册初始化程序。在代码中初始化它时,我无法让它工作。 InitializeDatabase 被调用,但以下条件永远不会成立:

(!context.Database.Exists() || !context.Database.ModelMatchesDatabase())

这是因为这发生在迁移运行之后...

我也在一个阶段尝试过这个:Unique Constraint in Entity Framework Code First,这和以前一样的问题,这个条件永远不会返回 true。

理想情况下,我想在我的迁移文件中包含一些标准 SQL。有没有办法做到这一点?如果没有,我在哪里可以看到如何使用代码优先迁移来实现这一目标?

谢谢!

更新:

我不能使用SQL函数有什么原因吗?

 public override void Up()
 {
        AddColumn("Posts", "Abstract", c => c.String());

        Sql("UPDATE Posts SET Abstract = LEFT(Content, 100) WHERE Abstract IS NULL");
 }

显然使用了正确的 SQL...

【问题讨论】:

    标签: entity-framework ef-code-first asp.net-mvc-4 code-first


    【解决方案1】:

    从 EF 6.1 开始,您现在可以在模型中使用任一

    一个属性

     [Index("IX_UniqueName", IsUnique = true)]
     public string Name {get;set;}
    

    或流利

    Property(s => s.Name).HasColumnAnnotation(IndexAnnotation.AnnotationName,
        new IndexAnnotation(
            new IndexAttribute("IX_UniqueName") { IsUnique = true }));
    

    流畅的方法并不像它疯狂冗长的 IMO 那样完美,但至少现在是可能的。

    更多关于亚瑟维克斯博客http://blog.oneunicorn.com/2014/02/15/ef-6-1-creating-indexes-with-indexattribute/

    【讨论】:

      【解决方案2】:

      通过代码优先迁移,我刚刚在 Up() 方法中使用它来为单个列添加唯一索引:

      CreateIndex(table: "Organisations", 
                  column: "Name", 
                  unique: true, // unique index
                  name: "MyIndex");
      

      ...然后在Down() 方法中:

      DropIndex(table: "Organisations", 
                name: "MyIndex");
      

      这就是你所追求的吗?

      【讨论】:

        【解决方案3】:

        您可以在包管理器控制台中使用 Add-Migration 命令构建新的迁移。创建空迁移后,在Up 方法中,您可以使用DbMigration 类的CreateIndex 方法创建新索引。它看起来像这样:

        CreateIndex("dbo.Accounts", "AccessKey", unique: true);

        【讨论】:

        • 如果您使用自动迁移,您会怎么做?
        • @MikeCole 我知道您的评论已经过时了,但请看我的新答案,因为现在可以这样做了
        猜你喜欢
        • 2013-04-04
        • 2015-07-03
        • 1970-01-01
        • 2013-06-29
        • 2011-05-23
        • 2021-01-15
        • 2013-09-24
        • 2019-05-25
        • 2012-10-06
        相关资源
        最近更新 更多