我看过很多关于这个问题的帖子,但是都没有解决我的问题
场景 具有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
谢谢您的帮助
答案 0 :(得分:0)
您陷入了一种经典情况,即您将上下文保持太长时间了。
由于NationalityManager
已注册为单例,因此您的上下文已注册为瞬态无关紧要。生命周期短的事物有效地注入了生命周期较长的事物,这意味着生命周期较短的事物会因生命周期更长的事物而延长。
您可以缩短经理对象的寿命,也可以向经理中注入context factory。上下文工厂确保在需要时创建您(应该是短暂的)上下文。
当同时有API调用进入时,它们将尝试同时使用非线程安全上下文。第一个调用是建立模型,然后是另一个调用,它要在建立模型时使用模型 。
在EF Core之前,我addressed this issue使用了为.NET Framework设计的原始EF。它可能会为您提供更多背景知识。