我启用了迁移,我编写了种子代码,如下所示:
protected override void Seed(DbContext c)
{
c.DbSet<Table1>.AddOrUpdate(..);
c.DbSet<Table2>.AddOrUpdate(..);
c.DbSet<Table3>.AddOrUpdate(..);
}
我需要按顺序运行table1,因为table2引用table1,table3引用table1和table2。
但EF6优化了代码生成的T-SQL批处理,他们在table1中查询table3的引用,并且由于table1尚未初始化,因此没有任何内容,并且EF6抛出异常。
答案 0 :(得分:1)
如果您已在应用程序上下文类中定义了DbSets,例如Table1,则为:
public DbSet<Table1> Table1 { get; set; }
为什么不尝试写这样的语句:c.Table1.AddOrUpdate(...)
?如果这不起作用,您可以尝试在每个语句后添加c.SaveChanges()
,以便在继续执行下一个语句之前将对Table1所做的任何更改保存到数据库中。当然它会慢一些,但如果不经常运行种子方法,那么这可能不是问题吗?