【发布时间】: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