我刚刚使用代码优先模型从Entity Framework 6.0.2升级到6.1.0。
升级后,context.Database.CompatibleWithModel(true)
返回false,因此EF认为数据库不再与模型兼容。我没有改变任何其他东西,只是升级了EF。
我运行Add-Migration
以查看会发生什么,并且EF创建了一个大型迁移,似乎在每个表上的每个外键属性上创建索引:
public override void Up()
{
CreateIndex("dbo.ActivityStreams", "UserId");
CreateIndex("dbo.Users", "OfficeId");
CreateIndex("dbo.Offices", "ParentId");
CreateIndex("dbo.Rosters", "UserId");
...and many more similar lines...
我想这与EF 6.1中的新索引功能有关?有点奇怪,但还行。
当我Update-Database
应用新迁移时,存在索引已存在的错误。查看数据库和以前的迁移,几乎所有索引确实已经存在。
我在这里做错了什么?是否有升级EF的程序?
答案 0 :(得分:11)
正如其他答案所述,这是由于实体框架错误造成的。将DropIndex
代码复制到Up
方法的已接受答案会导致对数据库进行不必要的工作。相反,我建议正确的做法是删除Up
和Down
方法的内容,因为这些索引已经存在且不需要删除。
答案 1 :(得分:8)
我有完全相同的问题。我通过重新创建索引来修复它。
我通过在迁移到Up方法时从Down方法粘贴DropIndexes来完成此操作。 因此,首先有效地删除索引,然后重新创建它们。 不知道为什么这是必要的,但它解决了这个问题。
答案 2 :(得分:1)
Re:您的外键正在创建,我在以下链接中找到了以下信息:
http://blog.oneunicorn.com/2014/02/15/ef-6-1-creating-indexes-with-indexattribute/声明如下:
ForeignKeyIndexConvention Code First约定导致为模型中任何外键的列创建索引,除非这些列已经使用IndexAttribute指定了索引。如果您不想要FK的索引,可以删除此约定:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<ForeignKeyIndexConvention>();
}