应用程序中断访问 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 中的已处置对象

实体框架:如何防止 dbcontext 被多个线程访问?

在 ASP.NET Core Authorize-Attribute 中使用带有 DbContext 的存储库:“无法访问已处置的对象”

在Google OAuth流中访问EF DbContext

ASP.NET Identity DbContext 混淆