C# 使用实体框架核心迁移更新表以添加自动增量

C# 使用实体框架核心迁移更新表以添加自动增量,c#,asp.net,sql-server,entity-framework-core,C#,Asp.net,Sql Server,Entity Framework Core,我有一个ASP.Net核心项目和一些表,已经链接到EF核心。 我在创建数据库时犯了一个错误,忘记了在PK上添加自动增量,所以当我尝试添加一些数据时,我不能,因为EF试图插入一个空值。我试着用一个表手动将自动增量修改为1,这样就可以了 但是我在多台计算机上工作,所以我的问题是:我可以创建一个迁移文件来更新我的另一个表并在它们的PK上添加自动增量吗 谢谢您可以通过Fluent API使用。使用SQLServerIdentityColumn(),然后添加迁移 虽然如果不提供当前的配置代码,很难进行演示

我有一个ASP.Net核心项目和一些表,已经链接到EF核心。 我在创建数据库时犯了一个错误,忘记了在PK上添加自动增量,所以当我尝试添加一些数据时,我不能,因为EF试图插入一个空值。我试着用一个表手动将自动增量修改为1,这样就可以了

但是我在多台计算机上工作,所以我的问题是:我可以创建一个迁移文件来更新我的另一个表并在它们的PK上添加自动增量吗


谢谢

您可以通过Fluent API使用
。使用SQLServerIdentityColumn()
,然后添加迁移

虽然如果不提供当前的配置代码,很难进行演示,但下面是一个示例:

public class BaseEntityTypeConfiguration<TEntity> : IEntityTypeConfiguration<TEntity> where TEntity : BaseEntity
{
    public virtual void Configure(EntityTypeBuilder<TEntity> entityTypeBuilder)
    {
        entityTypeBuilder.Property(x => x.Id)
                         .UseSqlServerIdentityColumn();
    }
}
公共类BaseEntityTypeConfiguration:EntityTypeConfiguration其中tenty:BaseEntity
{
公共虚拟void配置(EntityTypeBuilder EntityTypeBuilder)
{
entityTypeBuilder.Property(x=>x.Id)
.UseSqlServerIdentityColumn();
}
}

对于@Collin所说的自动增量,您可以使用Fluent API添加选项并更新迁移,我建议您在执行迁移之前创建一个.sql文件并立即更新所有记录,或者,作为使用seed方法的同一过程的一部分,您可以更新以前表中的所有记录,然后应用挂起的迁移

此种子方法可以如下所示

 public static class DbContextExtensions
    {
        public static void EnsureIdUpdates(this DbContext context)
        {
             //CHOOSE HERE if you want to execute a sql script using Context.Set<YourEntity>().FromSql   
             //OR

            //Do here a check to ensure that this method will be called just once as part of your migrations, for example if you ran this code before, you would be able to check that some records has an Id != 0 and you don't need to update the Ids again
            var dataToUpdate = context.Set<YourEntity>();
            int count = 0;
            dataToUpdate.ForEachAsync(x => { x.Id = count++; }).Wait();
            context.SaveChanges();
     }
}
 public void Configure(IApplicationBuilder app, IHostingEnvironment en, DbContext context)
 {
   ....
    context.EnsureIdUpdates();
    context.ApplyMigrations();
}



public static void ApplyMigrations(this DbContext dbContext, string[] excludeMigrations = null)
    {
        var pendingMigrations = dbContext.Database.GetPendingMigrations();

        foreach (var migration in pendingMigrations)
        {
            if (excludeMigrations != null && excludeMigrations.Contains(migration))
                continue;

            dbContext.Database.Migrate(migration);
        }
    }