我有一个带有一些表的ASP.Net Core项目,已经与EF Core链接了。 创建数据库时我犯了一个错误,并且忘记了在PK上添加自动增量,因此当我尝试添加一些数据时,我不能这样做,因为EF试图插入空值。我试过用一张表将自动增量手动修改为1,没关系。
但是我正在多台计算机上工作,所以我的问题是:我可以创建一个迁移文件来更新其他表并在其PK上添加auto_increment吗?
谢谢
答案 0 :(得分:0)
您可以通过Fluent API使用.UseSqlServerIdentityColumn()
,然后添加迁移。
虽然在不提供您当前配置代码的情况下很难进行演示,但以下示例显示了这种情况:
public class BaseEntityTypeConfiguration<TEntity> : IEntityTypeConfiguration<TEntity> where TEntity : BaseEntity
{
public virtual void Configure(EntityTypeBuilder<TEntity> entityTypeBuilder)
{
entityTypeBuilder.Property(x => x.Id)
.UseSqlServerIdentityColumn();
}
}
答案 1 :(得分:0)
对于@Collin所说的自动增量,您可以使用Fluent API添加该选项并更新迁移,我也建议创建一个.sql文件并在执行迁移之前一次或全部更新所有记录。使用种子方法执行相同过程的操作,您可以更新先前表中的所有记录,然后再应用挂起的迁移。
这种种子方法看起来像这样
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();
}
}
然后在您的启动类上使用Configure方法
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);
}
}