创建模型时不能使用上下文。 EF-核心ASP.net Core2.2

时间:2019-03-06 14:35:05

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

我看过很多关于这个问题的帖子,但是都没有解决我的问题

场景  具有API控制器的数据库层  IDataRepository  数据管理器

代码

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;
    }

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

我做错了

这是我使用过的教程Building An ASP.NET Core Application With Web API And Code First Development

谢谢您的帮助

1 个答案:

答案 0 :(得分:0)

您陷入了一种经典情况,即您将上下文保持太长时间了。

由于NationalityManager已注册为单例,因此您的上下文已注册为瞬态无关紧要。生命周期短的事物有效地注入了生命周期较长的事物,这意味着生命周期较短的事物会因生命周期更长的事物而延长。

您可以缩短经理对象的寿命,也可以向经理中注入context factory。上下文工厂确保在需要时创建您(应该是短暂的)上下文。

当同时有API调用进入时,它们将尝试同时使用非线程安全上下文。第一个调用是建立模型,然后是另一个调用,它要在建立模型时使用模型

在EF Core之前,我addressed this issue使用了为.NET Framework设计的原始EF。它可能会为您提供更多背景知识。