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

时间:2012-10-25 14:06:26

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

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

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

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

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

public AppDatabaseContext() : base("MyConnectionDBContext")

当我使用Package Management Console更新数据库时,不会调用重写的种子方法:

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,这是和以前一样的问题,这个条件从未返回真实。

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

3 个答案:

答案 0 :(得分:30)

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

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

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

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

这就是你要追求的吗?

答案 1 :(得分:7)

从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 :(得分:5)

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

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