Entity Framework 更改主键类型
Entity Framework Change Primary Key Type
我使用的是 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 迁移将处理所有事情还是应该以其他方式完成?
好的,可以实际回答您的问题。 是的您可以只更改数据类型,迁移应该会处理它。
但是根据您的评论,您在应用此迁移时遇到了问题。这并没有否定上述内容,但我会尝试使用一些猜测来帮助您。
如果您使用的是 Sql Azure,则必须在所有 table 上都有聚簇索引。 EF6 甚至应该在字符串键上创建聚簇索引。 alpha 3 存在一个错误,但它不会在迁移中创建聚集键 table。
http://entityframework.codeplex.com/discussions/435723
请参阅上面的 link 了解说明和解决方法。
如果您仍然遇到问题,您可以从程序包控制台运行执行以下命令:
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 键并且有这个选项,请不要在它们上聚集,而是使用第二个聚集索引。
如果你想在 EF Core 中更改主键数据类型,这里有一个解决方案:
- 删除索引和约束
- 将 Id 重命名为旧 Id
- 创建正确数据类型的新 Id
- 运行 嵌入的 sql 更新外键的语句
- 删除旧 ID
- 创建新索引和约束
这是完整的文章:https://www.codeproject.com/Articles/1193009/Changing-primary-key-data-type-in-EF-Core
我使用的是 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 迁移将处理所有事情还是应该以其他方式完成?
好的,可以实际回答您的问题。 是的您可以只更改数据类型,迁移应该会处理它。
但是根据您的评论,您在应用此迁移时遇到了问题。这并没有否定上述内容,但我会尝试使用一些猜测来帮助您。
如果您使用的是 Sql Azure,则必须在所有 table 上都有聚簇索引。 EF6 甚至应该在字符串键上创建聚簇索引。 alpha 3 存在一个错误,但它不会在迁移中创建聚集键 table。
http://entityframework.codeplex.com/discussions/435723
请参阅上面的 link 了解说明和解决方法。
如果您仍然遇到问题,您可以从程序包控制台运行执行以下命令:
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 键并且有这个选项,请不要在它们上聚集,而是使用第二个聚集索引。
如果你想在 EF Core 中更改主键数据类型,这里有一个解决方案:
- 删除索引和约束
- 将 Id 重命名为旧 Id
- 创建正确数据类型的新 Id
- 运行 嵌入的 sql 更新外键的语句
- 删除旧 ID
- 创建新索引和约束
这是完整的文章:https://www.codeproject.com/Articles/1193009/Changing-primary-key-data-type-in-EF-Core