【问题标题】:The context cannot be used while the model is being created. EF-Core ASP.net Core2.2创建模型时不能使用上下文。 EF-Core ASP.net Core2.2
【发布时间】:2019-07-28 06:20:45
【问题描述】:

我看到很多帖子都在谈论这个问题,但都没有解决我的问题

场景 带有 API 控制器的数据库层 数据存储库 数据管理器

代码

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

应用程序上下文

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

感谢您的帮助

【问题讨论】:

  • 一般来说,你正在做的是一个非常糟糕的模式。上下文假定是有范围的。通过使其瞬态然后将其注入单例,您实际上也使其成为单例,接受您的每个存储库都有自己的副本。这将破坏各种破坏,因为他们无法在同一个上下文实例中协调他们的行为。将上下文保持在范围内,并使您的存储库也在范围内。首先,他们没有理由成为单身人士。
  • 可以在 ApplicationContext 类中添加 OnConfiguring 方法吗?在它和 NationalityManager.Get 方法的顶部放置一个断点。看看哪个先命中。
  • @ibrahimozgon Manager 先点击然后覆盖 OnConfiguring
  • @Chris Pratt 我是 Core 新手,所以如果您发送更好的模式,我会更改我的应用程序刚刚开始

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


【解决方案1】:

您陷入了一个典型的情况,即您将上下文保留得太久。

因为NationalityManager 被注册为单例,所以您的上下文被注册为瞬态并不重要。将寿命短的东西注入寿命长的东西实际上意味着寿命短的东西被寿命长的东西的寿命延长了。

您可以缩短管理器对象的生命周期,也可以将context factory 注入到管理器中。上下文工厂确保在需要时创建您的(应该是短暂的)上下文。

当您同时收到 API 调用时,它们会尝试同时使用非线程安全上下文。第一个调用是设置模型,然后是另一个调用在设置时使用模型

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

【讨论】:

  • 谢谢,我在你的帖子github.com/vany0114/EF.DbContextFactory 中看到了这个链接,我只是想知道他如何将数据获取到控制器和视图(我在帖子中找不到视图)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
  • 2018-05-01
  • 2011-08-31
  • 1970-01-01
相关资源
最近更新 更多