20

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

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

我尝试了以下,标记为答案:EFCodeFirst 和 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())

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

我也在一个阶段尝试过这个: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 ...

4

3 回答 3

33

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

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

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

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

这就是你所追求的吗?

于 2012-12-26T19:03:20.543 回答
9

从 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 那样完美,但至少现在是可能的。

更多关于 Arthur Vickers 博客http://blog.oneunicorn.com/2014/02/15/ef-6-1-creating-indexes-with-indexattribute/

于 2015-03-27T03:45:14.427 回答
6

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

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

于 2013-01-16T21:39:12.950 回答