我正在做实体框架(V5)代码优先迁移,在MVC4应用程序上。我想在数据库级别添加一个唯一的约束。
我知道这可以在创建表的时候完成,但是我已经有了一个表。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...
发布于 2012-12-27 03:03:21
对于代码优先迁移,我只是在Up()方法中使用了这一点,以便在单个列上添加唯一索引:
CreateIndex(table: "Organisations",
column: "Name",
unique: true, // unique index
name: "MyIndex");然后在Down()方法中使用...and:
DropIndex(table: "Organisations",
name: "MyIndex");这就是你要找的吗?
发布于 2015-03-27 11:45:14
从EF6.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 }));流利的方法并不完美,因为它非常冗长,但至少现在它是可能的。
更多关于亚瑟·维克斯博客http://blog.oneunicorn.com/2014/02/15/ef-6-1-creating-indexes-with-indexattribute/的细节
发布于 2013-01-17 05:39:13
您可以从包管理器控制台使用Add-Migration命令来搭建一个新的迁移框架。创建空迁移后,在Up方法中,可以使用DbMigration类的CreateIndex方法创建新索引。它看起来像这样:
CreateIndex("dbo.Accounts", "AccessKey", unique: true);
https://stackoverflow.com/questions/13070431
复制相似问题