Entity framework 使用代码优先迁移的实体框架的唯一约束

Entity framework 使用代码优先迁移的实体框架的唯一约束,entity-framework,ef-code-first,asp.net-mvc-4,code-first,Entity Framework,Ef Code First,Asp.net Mvc 4,Code First,我正在MVC4应用程序上进行EntityFramework(V5)代码优先迁移。我想在数据库级别添加一个唯一的约束 我知道这可以在创建表时完成,但我已经有了一个表。 我尝试了以下方法,标记为答案: 我的数据库上下文略有不同,我提供的连接名称如下 public AppDatabaseContext() : base("MyConnectionDBContext") 使用包管理控制台更新数据库时,不会调用重写的种子方法: protected override void Seed(AppDatab

我正在MVC4应用程序上进行EntityFramework(V5)代码优先迁移。我想在数据库级别添加一个唯一的约束

我知道这可以在创建表时完成,但我已经有了一个表。

我尝试了以下方法,标记为答案:

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

public AppDatabaseContext() : base("MyConnectionDBContext")
使用包管理控制台更新数据库时,不会调用重写的种子方法:

protected override void Seed(AppDatabaseContext context)
我还尝试了以下方法:

我没有使用嵌套类,这是因为我似乎必须通过app.config注册初始值设定项。在代码中初始化时,我无法使其工作。已调用InitializeDatabase,但以下条件永远不会为真:

(!context.Database.Exists() || !context.Database.ModelMatchesDatabase())
这是因为这发生在迁移运行之后

我也试过一个阶段:,这是和以前一样的问题,这个条件永远不会变为真

理想情况下,我希望在迁移文件中包含一些标准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…

,我刚刚在
Up()
方法中使用了它来在单个列上添加唯一索引:

CreateIndex(table: "Organisations", 
            column: "Name", 
            unique: true, // unique index
            name: "MyIndex");
…然后在
Down()方法中:

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

这就是您想要的吗?

您可以从package manager控制台使用
Add migration
命令构建一个新的迁移。创建空迁移后,在
Up
方法中,可以使用
DbMigration
类的
CreateIndex
方法创建新索引。它看起来像这样:
CreateIndex(“dbo.Accounts”,“AccessKey”,unique:true)

自EF 6.1以来,您现在可以在您的模型中使用

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

 [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 }));
流畅的方法并不完美,因为它的疯狂冗长,但至少现在是可能的


Arthur Vickers博客上的更多deets

如果您使用自动迁移,您将如何做到这一点?@MikeCole我知道您的评论非常陈旧,但请查看我的新答案,因为现在这是可能的