ServiceLifetime.Transient导致各种数据库异常

时间:2018-11-06 10:03:22

标签: c# sql-server asp.net-core entity-framework-core

我要删除数据库,然后再次创建它并使用数据进行播种。

使用这种类型的注册表,一切正常

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()吗?

1 个答案:

答案 0 :(得分:0)

解决方案:

我删除了

  

ServiceLifetime.Transient

,然后在我的Initializer类中,将.Wait()添加到

  

userManager.CreateAsync();

因为我一直在动态地创建用户。

并且它停止引发有关在其他线程中使用上下文的异常。

还是一般在等待?