应用程序中断访问 dbcontext、Asp .net 核心 web api 2.0 与实体框架核心 2.0 数据库第一种方法
Posted
技术标签:
【中文标题】应用程序中断访问 dbcontext、Asp .net 核心 web api 2.0 与实体框架核心 2.0 数据库第一种方法【英文标题】:Application break accessing dbcontext, Asp .net core web api 2.0 with entity framework core 2.0 database first approach 【发布时间】:2018-02-01 19:45:15 【问题描述】:我已经使用 EntityFrameworkCore.SqlServer 2.0 开发了 asp .net core wep api 2.0 应用程序。它是使用数据库优先方法开发的。当尝试使用 dbcontext 应用程序访问实体时,应用程序将中断模式。我找不到应用程序状态变为中断状态的原因。请帮助解决这个问题。
下面是 DBContext 类中的 OnConfiguring 方法。
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
if (!optionsBuilder.IsConfigured)
optionsBuilder.UseSqlServer(@"Server=(local);Database=VotingAppDB;User ID=sa;Password=123;");
以下代码块用于访问控制器中的 dbcontext 实体
// GET api/values
[HttpGet]
public IEnumerable<string> Get()
VotingAppDBContext context = new VotingAppDBContext();
var questions = context.Questions.ToList();
return new string[] "value1", "value2" ;
【问题讨论】:
我有确切的问题。到目前为止我不知道如何解决它。 所以...您的数据库有模式吗?当我删除我的架构然后搭建脚手架时,它开始工作了。 我发现了我的问题。我使用 VARCHAR(max) 来定义列长度。不知何故 EF 不理解这一点并默默地失败 好吧,我对 PrimaryKey 的自引用键不正确而告终。而不是抛出错误并告诉我它只是做了应用程序中断模式。基本上逐表仔细检查你的模式表,并确定你在哪里犯了严重错误。 非常感谢。这就是原因。我的架构也有自引用主键。当我删除它时,它可以正常工作。我不知道为什么 Visual Studio 会这样,它对用户不友好。是否有任何技术可以追踪此类问题? 【参考方案1】:1.- 首先,您不应该在控制器内创建上下文,避免使用带有依赖项的“新”,因为这会使您的代码无法测试,在我使用 UnitOfWork 的情况下,我将其作为 IUnitOfWork 实例注入,确实是 MyConext 的扩展,您可以将其注入 StartUp 类中...为此,我有一个私有方法(在单个私有调用中执行此操作),如下所示:
private void AddEntityFrameworkAndDbContext(IServiceCollection services)
services.AddEntityFrameworkSqlServer();
var migrationsAssemblyName = typeof(MyContext).GetTypeInfo().Assembly.GetName().Name;
services.AddDbContext<MyContext>(options =>
options.UseSqlServer(
"MY CONNECTION STRING GOES HERE (BUT I RETREIVE IT FROM ANOTHER SERVICE)",
sqlServerOptionsAction: sqlOptions =>
sqlOptions.MigrationsAssembly(migrationsAssemblyName);
sqlOptions.EnableRetryOnFailure(maxRetryCount: 5, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null);
);
,
ServiceLifetime.Scoped // Showing explicitly that the DbContext is shared across the HTTP request scope (graph of objects started in the HTTP request)
).AddUnitOfWork<MyContext>(); // This is because I'm also using EF Core Unit of work NuGet Package
正如我所说,我在 StartUp 类中从 ConfigureServices(IServiceCollection services) 调用该私有方法
// Add EF, and UoW
AddEntityFrameworkAndDbContext(services);
2.- 其次(但我会说这是你真正的问题)我会说你错过了 base.OnConfiguring(options);在您的上下文中,它应该是:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
if (!optionsBuilder.IsConfigured)
optionsBuilder.UseSqlServer(@"Server=(local);Database=VotingAppDB;User ID=sa;Password=123;");
base.OnConfiguring(optionsBuilder);
另外,请看一下我几周前写的这个答案: How to setup EF6 Migrations with ASP.NET Core
此外,UnitOfWork 项目值得一读,请在此处查看:https://github.com/arch/UnitOfWork
希望对你有帮助
胡安
【讨论】:
【参考方案2】:不确定问题是否仍然存在。我今天也遇到了同样的问题。解决方法是将所有 nuget 包(在我的情况下为 Microsoft.Extensions.Configuration 等)更新到最新版本。
【讨论】:
就我而言,这是由于自引用主键。当我删除该引用时,它起作用了。【参考方案3】:当您的架构中有自引用主键时会发生这种情况。使用 sql server 数据库图,您可以以图形方式查看。您必须删除该引用才能解决此问题。
【讨论】:
以上是关于应用程序中断访问 dbcontext、Asp .net 核心 web api 2.0 与实体框架核心 2.0 数据库第一种方法的主要内容,如果未能解决你的问题,请参考以下文章
注入 DbContext 时无法访问 ASP.NET Core 中已释放的对象
C#:使用 IQueryable 注入 DbContext 时,无法访问 ASP.NET Core 中的已处置对象
在 ASP.NET Core Authorize-Attribute 中使用带有 DbContext 的存储库:“无法访问已处置的对象”