我要删除数据库,然后再次创建它并使用数据进行播种。
使用这种类型的注册表,一切正常
services.AddDbContext<Context>
(
options => options.UseSqlServer(Configuration["Database"]
);
但是,当我添加ServiceLifetime.Transient
时,它立即抛出各种异常,例如:
services.AddDbContext<Context>
(
options => options.UseSqlServer(Configuration["Database"], ServiceLifetime.Transient
);
SqlException:违反PRIMARY KEY约束“ PK_myTable”。无法在对象“ dbo.myTable”中插入重复键。 重复的键值为([guid])。 该声明已终止。
SqlException:当IDENTITY_INSERT设置为OFF时,无法在表'myTable'中为标识列插入显式值。
怎么了?
public void Configure(IApplicationBuilder app, IHostingEnvironment env, Context context, SignInManager<User> sm, UserManager<User> um)
{
(...)
context.Database.EnsureDeleted();
context.Database.EnsureCreated();
new Initializer(context, um).Initialize().Wait();
(...)
}
public class Initializer
{
private readonly UserManager<User> _userManager;
private readonly Context _ctx;
public Initializer(Context c, UserManager<User> um)
{
_ctx = c;
_userManager = um;
}
public async Task Initialize()
{
filling my objects with data
(No, I'm not setting value to Id anywhere)
_ctx.SaveChanges();
}
我敢打赌,这是因为async / .Wait()吗?
答案 0 :(得分:0)
解决方案:
我删除了
ServiceLifetime.Transient
,然后在我的Initializer类中,将.Wait()添加到
userManager.CreateAsync();
因为我一直在动态地创建用户。
并且它停止引发有关在其他线程中使用上下文的异常。
还是一般在等待?