Entity framework 使用代码优先迁移的实体框架的唯一约束
我正在MVC4应用程序上进行EntityFramework(V5)代码优先迁移。我想在数据库级别添加一个唯一的约束 我知道这可以在创建表时完成,但我已经有了一个表。 我尝试了以下方法,标记为答案: 我的数据库上下文略有不同,我提供的连接名称如下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
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我知道您的评论非常陈旧,但请查看我的新答案,因为现在这是可能的