SET IDENTITY_INSERT ON
情境
需要將舊 mysql 資料表匯入到新的 mssql 資料表
問題1
ABP 中 Entity<int>
Id 屬性的 setter 是 private 所以無法指定該值
解決方案
改繼承 Entity
public class User : Entity
{
public long Id { get; set; }
public string Name { get; set; }
public override object[] GetKeys()
{
return new object[] { Id };
}
}
問題2
自動增量識別欄位於 Insert 資料指定 Id 時會得到例外,錯誤訊息如下
Cannot insert explicit value for identity column in table 'Users' when IDENTITY_INSERT is set to OFF.
解決方案
SET IDENTITY_INSERT ON
await _repository.InsertAsync(new User
{
Id = 8888,
Name = "Test"
});
var db = await _repository.GetDbContextAsync();
await db.Database.ExecuteSqlRawAsync("SET IDENTITY_INSERT dbo.NandPackageUsages ON;");
await db.SaveChangesAsync();
await db.Database.ExecuteSqlRawAsync("SET IDENTITY_INSERT dbo.NandPackageUsages OFF;");
備註
目前是新開分支把 Entity<int>
改為 Entity
並將邏輯寫在 DataSeedContributor
執行 DbMigrator
專案
預計僅在系統上線時執行一次
其實資料不複雜可以直接用 csv 匯出匯入
也有其他現成的 migration tools 可以將 mysql 匯入到 mssql