实体框架更改主键类型

时间:2015-01-23 10:44:20

标签: 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
 }

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

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

2 个答案:

答案 0 :(得分:2)

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

但根据您的评论,您在应用此迁移时遇到问题。这并不能否定上述内容,但我会尝试帮助您进行一些猜测。

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

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

有关说明和解决方法,请参阅上述链接。

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

Update-Database -Script

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

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

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

另外值得注意的是: Guids制作糟糕的聚集索引。如果您正在使用GUID密钥并具有该选项,请不要对它们进行集群并改为使用第二个聚簇索引。

答案 1 :(得分:0)

如果要在EF Core中更改主键数据类型,请使用以下解决方案:

  • 删除索引和约束
  • 将ID重命名为旧ID
  • 制作正确数据类型的新ID
  • 运行嵌入式sql语句以更新外键
  • 删除旧ID
  • 创建新的索引和约束

这是全文:https://www.codeproject.com/Articles/1193009/Changing-primary-key-data-type-in-EF-Core