C# 如何在EntityFramework6.1中使用IndexAttribute添加列索引而不获取SqlExceptions?

C# 如何在EntityFramework6.1中使用IndexAttribute添加列索引而不获取SqlExceptions?,c#,mysql,sql-server,database,entity-framework,C#,Mysql,Sql Server,Database,Entity Framework,我使用EntityFramework6.1代码优先的方法来创建数据库模式。这几个月来一直很好,但随着数据库的使用越来越多,我决定需要在一些列上添加索引,以在一些场景中提高查询性能 抱歉,这是一个有点长的解释,我不知道哪些步骤,如果有的话,与我现在看到的错误有关 首先,我从这样一个现有的财产开始: [必需] 公共字符串LocationId{get;set;} 在我的第一次尝试中,我尝试简单地添加索引属性,如下所示: [索引] [必需] 公共字符串LocationId{get;set;} 由于启用了

我使用EntityFramework6.1代码优先的方法来创建数据库模式。这几个月来一直很好,但随着数据库的使用越来越多,我决定需要在一些列上添加索引,以在一些场景中提高查询性能

抱歉,这是一个有点长的解释,我不知道哪些步骤,如果有的话,与我现在看到的错误有关

首先,我从这样一个现有的财产开始:

[必需] 公共字符串LocationId{get;set;} 在我的第一次尝试中,我尝试简单地添加索引属性,如下所示:

[索引] [必需] 公共字符串LocationId{get;set;} 由于启用了自动迁移,所以我尝试直接运行它,但在我启动并运行并查看数据库之后,没有添加索引,因此我执行了添加迁移->更新数据库的舞蹈

更新数据库失败,原因是:

System.Data.SqlClient.SqlException (0x80131904): Column 'LocationId'
in table 'dbo.Deliveries' is of a type that is invalid for use as a
key column in an index.
所以我恢复了所有代码,添加了一个[MaxLength128]属性,因为我的ID是GUID,然后重新运行Add Migration->Update Database

[最大长度128] [必需] 公共字符串LocationId{get;set;} 这次我遇到了这个线程中描述的错误,因为EF为我的列添加了默认约束:

我使用那里的解决方案删除了默认约束,我的迁移没有遇到任何问题

回到索引,我添加了我的索引属性,所以我说到这一点:

[索引] [最大长度128] [必需] 公共字符串LocationId{get;set;} 这次添加迁移->更新数据库成功了,瞧,我的索引被添加到了数据库中。不幸的是,当我实际运行我的项目时,我现在得到了一个新的SqlException

这一行:

IQueryable query=context.Set.AsNoTracking; 此例外情况:

A first chance exception of type 'System.Data.SqlClient.SqlException' occurred
in EntityFramework.dll

Additional information: The index 'IX_LocationId' is dependent on column
'LocationId'.

我一辈子都搞不懂这意味着什么。。。如果我从我的模型中删除[Index]属性,代码就会运行得很好,并且索引仍在数据库中。。。但这不是我可以在生产中运行的东西。

这里有很多东西不适合我。首先,我希望一个键字段在默认情况下有一个索引——尽管我必须说我还没有在varcharmax上测试过这一点。然后你说EF添加了一个默认约束-我认为这也不正常。为什么要在字符串中存储Guid而不是Guid?你读过关于guid的索引吗?这些列不是正确的外键,它们只是我们以这种方式用来索引到其他表中的列。它们恰好是字符串,因为我遵循的是我过去参与的另一个项目的惯例。我们所有的键都是基于其他项目约定的guid。。。但我猜那些船已经开航了。当我尝试添加[Index]属性时,有没有关于为什么会出现SqlException的见解?这有点不着边际,但另一个不重要的是,您启用了自动迁移,但您使用的是更新数据库。最后一个错误是否与尝试删除索引的自动迁移一致?我不认为自动迁移是一个好主意,我想你可能有什么想法,我对自动迁移总的来说感觉不好。。。我会尝试禁用它们,我想这会解决这个问题。我会用我的发现作为回应。谢谢@Colin!也许可以尝试[StringLength128]而不是[MaxLength128]。不确定区别是什么,但我使用的是StringLength。