gpt4 book ai didi

c# - 在迁移期间将标识设置为先前创建的列

转载 作者:行者123 更新时间:2023-12-04 00:38:50 24 4
gpt4 key购买 nike

我有一个使用 CodeFirst 数据库( Entity Framework 6)和两个迁移步骤的项目。在 Global.asax 的 Application_Start 中使用以下代码自动更新数据库:

Database.SetInitializer(
new MigrateDatabaseToLatestVersion<MyDBEntities, MyNamespace.Configuration>());

第一个迁移步骤是创建表:

CreateTable(
"dbo.GalleryAlbum",
c => new
{
Id = c.Int(nullable: false),
//other columns.....
})
.PrimaryKey(t => t.Id);

CreateTable(
"dbo.GalleryPics",
c => new
{
Id = c.Int(nullable: false),
//other columns.....
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.GalleryAlbum", t => t.AlbumId)
.Index(t => t.AlbumId);

第二个迁移步骤是将身份添加到创建的表中:

AlterColumn("dbo.GalleryAlbum", "Id", c => c.Int(nullable: false, identity: true));
AlterColumn("dbo.GalleryPics", "Id", c => c.Int(nullable: false, identity: true));

当我运行应用程序时,我可以看到第二个迁移代码正在运行,关于两个迁移的信息被添加到 _MigrationHistory 表中,但是两个表中的列都没有改变(没有标识)。这是架构:

[Id]        INT             NOT NULL,
//other columns

第一次迁移的 Code First 类如下:

 public partial class GalleryAlbum
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
}
//GalleryPics is the same

这是第二个迁移步骤:

public partial class GalleryAlbum
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
}
//GalleryPics is the same

您能告诉我,为什么没有将标识添加到这些列中吗?我该如何解决?

谢谢。

更新:生成对数据库的更新请求,我从 IDbCommandInterceptor 获得:

ALTER TABLE [dbo].[GalleryAlbum] ALTER COLUMN [Id] [int] NOT NULL
ALTER TABLE [dbo].[GalleryPics] ALTER COLUMN [Id] [int] NOT NULL

最佳答案

根据已接受的答案,如果您最初可以在创建表时包含标识,那么问题就解决了。但是,如果该表已经存在,并且您可以访问 SSMS,那么我发现最简单的方法是:

  1. 备份数据库...
  2. 更改您的类,以便在您的代码中有一个身份
  3. 使用包管理器控制台生成迁移(add-migration [您的迁移名称])
  4. 将新生成的migration中的Up方法中的代码注释掉
  5. 添加一行新代码,准备接收您将在下面生成的 SQL:Sql (@"");
  6. 进入 SSMS 并确保它已设置为在您更改表时生成脚本
  7. 在 SMSS 的表设计器中添加标识
  8. 在 SSMS 中保存表更改并复制生成的 SQL。 (该 SQL 使用数据复制表,删除原始表,然后使用列上设置的标识重新创建原始表,然后将所有数据复制回来并再次添加所有外键和约束)
  9. 将刚刚复制的 SQL 粘贴到上面添加的代码中的语音标记之间。
  10. 运行迁移

这应该会为您提供一个添加身份的迁移,并且可以在数据库的其他副本上成功运行。

注意:生成的 Down 方法也不起作用,因为它将删除身份 which EF also can't do .如果您需要 Down 方法工作,请创建您添加的 SQL 的副本并对其进行调整以再次创建没有标识的表。

关于c# - 在迁移期间将标识设置为先前创建的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21810562/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com