我看过很多帖子在谈论问题,但它们都没有解决我的问题
场景带有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解决了这个问题。它可能会给您更多背景。