创建模型时无法使用上下文.EF核ASP.NET CORE2.2



我看过很多帖子在谈论问题,但它们都没有解决我的问题

场景带有API控制器的DB层iDatarepositorydatamanagers

代码

startup.cs

  public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddDbContext<ApplicationContext>(opts => opts.UseSqlServer(Configuration["ConnectionString:LawyerApplicationDB"]), ServiceLifetime.Transient);
        services.AddSingleton(typeof(IDataRepository<Clients, long>), typeof(ClientManager));
        services.AddSingleton(typeof(IDataRepository<Nationality, long>), typeof(NationalityManager));
        services.AddMvc();
    }

ApplicationContext

public class ApplicationContext: DbContext
{
    public ApplicationContext(DbContextOptions opts) : base(opts)
    {
    }
    
    public DbSet<Clients> Clients { get; set; }
    public DbSet<Nationality> Nationalities { get; set; }
  
    
    
}

出现错误的经理

 public class NationalityManager : IDataRepository<Nationality, long>
{
    private ApplicationContext ctx; //not static
    public NationalityManager(ApplicationContext c)
    {
        ctx = c;
    }
    
    public Nationality Get(long id)
    {
        var nationality = ctx.Nationalities.FirstOrDefault(b => b.Id == id);
        return nationality;
    }
    public IEnumerable<Nationality> GetAll()
    {
        var nationalities = ctx.Nationalities.ToList();
        return nationalities;
    }

错误首次出现,网格不会显示数据,如果我刷新页面,则数据将显示

我做错了什么

这是我使用Web API的ASP.NET核心应用程序的教程

谢谢您的帮助

您已经陷入了一个经典的情况,在这种情况下,您将上下文保持太长。

因为NationalityManager被注册为单身人士,因此您的上下文注册为瞬态都没关系。寿命短的东西有效地注入了长寿,这意味着寿命延长的寿命延长了。

您可以使经理对象较短,也可以将上下文工厂注入经理。上下文工厂可确保您的(应该短暂的)在需要时创建上下文。

当您同时有API呼叫时,他们正在尝试同时使用非线程安全上下文。第一个呼叫是设置模型,然后是另一个呼叫,希望在设置时使用模型

在EF Core之前,我已经使用为.NET框架设计的原始EF解决了这个问题。它可能会给您更多背景。

最新更新