应用程序无法访问DbContext,使用Entity Framework Core 2.0数据库优先方法的Asp .net core web api 2.0。

7

我开发了一个使用EntityFrameworkCore.SqlServer 2.0的asp .net core web 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" };
    }

Installed packages

Application error


我有完全相同的问题。到目前为止,我还不知道如何解决它。 - hidden
那么...你的数据库有模式吗?当我移除了我的模式并进行脚手架操作后,它开始工作了。 - hidden
我找到了问题所在。我使用了VARCHAR(max)来定义列长度。不知何故,EF无法理解并默默失败了。 - hidden
1
好的,最终发现是我错误地使用了自引用键作为主键。它没有抛出错误并告诉我问题所在,而是直接进入了应用程序崩溃模式。基本上,逐个检查您的模式表,并确定您在哪里犯了关键错误。 - hidden
非常感谢。这就是原因。我的模式也具有自引用主键。当我删除它时,它可以正常工作而没有错误。我不知道为什么Visual Studio会表现出这种方式,它并不用户友好。有没有技术来跟踪这些问题? - bhathiya.m
3个回答

2

1.- 首先,你不应该在控制器中创建上下文,避免使用带有依赖的 'new',因为这会使你的代码无法测试。在我的情况下,我使用 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);
    }

另外,请看一下我几周前写的这个答案: 如何在ASP.NET Core中设置EF6迁移

此外,那个UnitOfWork项目值得一读,你可以在这里看看它:https://github.com/arch/UnitOfWork

希望能有所帮助, Juan


1

我不确定问题是否仍然存在。今天我遇到了同样的问题。解决方法是将所有nuget包(在我的情况下,Microsoft.Extensions.Configuration等)更新为最新版本。


在我的情况下,这是由于自引用主键导致的。当我移除了该引用后,它就可以工作了。 - bhathiya.m

-1

当您的模式中存在自引用主键时,就会出现此问题。使用 SQL Server 数据库图表可以以图形方式查看它。您必须删除该引用才能解决此问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接