我目前正在尝试将一些本地数据引入使用 EF Code-First 迁移的数据库中。这些数据已经具有唯一的 id,因此最初应该按原样插入第一组数据。
现在我正在考虑首先设置'DatabaseGeneratedOption.None',将数据集添加到数据库中,计算最后使用的ID,使用T-SQL命令'dbcc checkident(tablename,reseed,[NEW AUTO ID] )',然后在将 GeneratedOption 重置为 'DatabaseGeneratedOption.Identity' 时添加另一个迁移。
这是正确的方法和/或什至可能,还是我走错了路?
任何线索将不胜感激
最好的问候
编辑 - 迈克尔斯回答
试图实现 Michals 的答案,但 ID 仍然由数据库“生成”,并且我的显式值被忽略。也许这是我插入值的方式:
MyDbContext context = // GetContext;
DbSet<SomeClass> dbSet = context.SomeClass;
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT " + someClassTableName + " ON");
foreach(SomeClass sc in toAdd)
{
// sc already contains all data including its unique ID
sbSet.Add(sc);
}
context.SaveChanges();
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT " + someClassTableName + " OFF");
解决方案 /w Michals 答案
好吧,我尽我最大的努力以不同的方式实现 Michals 的答案,最后得出了一个(非常奇怪的)解决方案。
首先,我有我的 DBContext 类和一个名为 DBContextEditor 的衍生类。所做的只是在我更改所有“身份”属性的地方覆盖 OnModelCreating。
public class MyContextEditor : MyContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<SomeClass>()
.Property(e => e.ID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
}
}
将此类与其他帖子(下面的来源)中的其他一些技术结合使用,最终给了我想要的结果。
最后我有这样的事情:
MyContext context = new MyContextEditor();
DbSet<SomeClass> dataSet = context.SomeClass;
// this.Clear(dataSet); Just for testing to reset Identity Auto ID and remove all Data
// this.Reset(dataSet);
context.Database.Connection.Open();
// Add data to dataSet...
// dataSet.Add(toAdd);
// Apply Michals answer and save
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT " + tableName + " ON");
context.SaveChanges();
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT " + tableName + " OFF");
// Close Connection
context.Database.Connection.Close();
我还尝试实现对 MyContext 类的覆盖,该类以错误结尾说“烘焙模型不同......”这也将 ID 属性更改为不再是“身份”。
最后,这种方法让我可以控制添加身份数据,同时保持生成身份值的可能性。此外,任何进一步的迁移都不会更改模型,也不会删除“身份”标志,而 [DatabaseGeneratedOption] 确实删除了它。也可以并建议将其存储在 using 中,如下所示:
using( var transaction = context.Database.BeginTransaction'))
仅供参考伪代码中的模型
class SomeClass
{
[Key]
public int ID { get; set; }
public string Title { get; set; }
// More Properties
}
相关帖子和来源