实体框架更改主键类型

hyp*_*erN 5 c# entity-framework entity-framework-6

我正在使用EF 6.0 Code First,我有这个实体:

 public class TrainingRespect
 {
    [Key]
    public int RespectId { get; set; }

    public DateTime? DateWhenRespected { get; set; }

    #region

    public string UserId { get; set; }
    public User User { get; set; }

    public Guid TrainingId { get; set; }
    public Trening Training { get; set; }

    #endregion
 }
Run Code Online (Sandbox Code Playgroud)

我想将它的主键(RespectId)从int更改为GUID/string/long.

这样做最简单的方法是什么?我可以只改变类型,EF迁移会处理所有事情,还是应该以其他方式完成?

Jam*_*esT 2

好的,实际回答你的问题。是的,您可以只更改数据类型,迁移应该会处理它。

但是,根据您的评论,您在应用此迁移时遇到了困难。这并不否定上述内容,但我将尝试使用一些猜测来提供帮助。

如果您使用的是 Sql Azure,则必须在所有表上拥有聚集索引。EF6 甚至应该在字符串键上创建聚集索引。alpha 3 有一个错误,但它不会在迁移表上创建聚集键。

http://entityframework.codeplex.com/discussions/435723

请参阅上面的链接以获取说明和解决方法。

如果您仍然遇到问题,可以从包控制台运行以下命令:

Update-Database -Script
Run Code Online (Sandbox Code Playgroud)

这将生成一个 SQL 脚本,而不是尝试直接更新。您可以查看此内容,看看是否有任何 Create Table 语句没有聚集索引。

如果由于某种原因没有。您可以显式修改迁移的 CreateTable 语句以使主键聚集。

CreateTable("MyTable", 
    c => new { 
        Id = c.String(nullable: false, maxLength: 128)
    })
.PrimaryKey(t => t.Id, null, true);
Run Code Online (Sandbox Code Playgroud)

另外值得注意的是:Guids 会产生糟糕的聚集索引。如果您使用 GUID 键并且可以选择,则不要在它们上聚集,而是使用第二个聚集索引。

  • 有关信息:Azure V12 预览版允许没有聚集索引的表 http://azure.microsoft.com/en-gb/documentation/articles/sql-database-preview-whats-new/ (2认同)