首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用代码优先迁移的实体框架的唯一约束

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

Stack Overflow用户
提问于 2012-10-25 22:06:26
回答 3查看 13.6K关注 0票数 20

我正在做实体框架(V5)代码优先迁移,在MVC4应用程序上。我想在数据库级别添加一个唯一的约束。

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

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

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

代码语言:javascript
运行
复制
public AppDatabaseContext() : base("MyConnectionDBContext")

当我使用包管理控制台更新数据库时,未调用覆盖的种子方法:

代码语言:javascript
运行
复制
protected override void Seed(AppDatabaseContext context)

我还尝试了以下内容:http://romiller.com/2010/07/31/ef-ctp4-tips-tricks-running-additional-ddl/

我没有使用嵌套类,这是因为我似乎必须通过app.config注册初始化器。当我在代码中初始化它的时候,我无法让它工作。调用了InitializeDatabase,但以下条件永远不为真:

代码语言:javascript
运行
复制
(!context.Database.Exists() || !context.Database.ModelMatchesDatabase())

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

我还在一个阶段尝试过:Unique Constraint in Entity Framework Code First,这是和以前一样的问题,这个条件永远不会返回true。

理想情况下,我希望在迁移文件中包含一些标准SQL。有没有办法做到这一点?如果没有,我可以在哪里看到如何使用代码优先迁移来实现这一点?

谢谢!

更新:

我不能使用SQL函数有什么原因吗?

代码语言:javascript
运行
复制
 public override void Up()
 {
        AddColumn("Posts", "Abstract", c => c.String());

        Sql("UPDATE Posts SET Abstract = LEFT(Content, 100) WHERE Abstract IS NULL");
 }

显然,使用正确的SQL...

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-27 03:03:21

对于代码优先迁移,我只是在Up()方法中使用了这一点,以便在单个列上添加唯一索引:

代码语言:javascript
运行
复制
CreateIndex(table: "Organisations", 
            column: "Name", 
            unique: true, // unique index
            name: "MyIndex");

然后在Down()方法中使用...and:

代码语言:javascript
运行
复制
DropIndex(table: "Organisations", 
          name: "MyIndex");

这就是你要找的吗?

票数 33
EN

Stack Overflow用户

发布于 2015-03-27 11:45:14

从EF6.1开始,您现在可以在模型中使用以下两种方法之一来执行此操作

一个属性

代码语言:javascript
运行
复制
 [Index("IX_UniqueName", IsUnique = true)]
 public string Name {get;set;}

或流利

代码语言:javascript
运行
复制
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/的细节

票数 9
EN

Stack Overflow用户

发布于 2013-01-17 05:39:13

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

代码语言:javascript
运行
复制
CreateIndex("dbo.Accounts", "AccessKey", unique: true);

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13070431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档