【问题标题】:NotImplemented Exceptions using MySQL Provider in ASP.NET Core With EF CoreNotImplemented Exceptions using MySQL Provider in ASP.NET Core with EF Core
【发布时间】:2017-04-26 07:06:05
【问题描述】:

我正在构建一个 ASP.NET Core 1.1.0 应用程序,该应用程序需要使用 Entity Framework Core 访问现有的 MySQL 数据库,我在 Visual Studio 2015 中构建了所有最新更新。我开始使用“官方” MySQL 提供程序 (MySql.Data.EntityFrameworkCore),但 Pomelo prvider (Pomelo.EntityFrameworkCore.MySql) 遇到了同样的问题。

注入到我的 Home 控制器的上下文对象有各种 NotImplemented 异常,如图所示。成员是我的 DBSet 集合之一,使用 Member POCO。 (顺便说一句,我不打算使用迁移,所以这不是一个因素。)这是上下文对象在注入控制器后的状态,甚至在我尝试访问数据之前。

典型消息的完整细节是:

((Microsoft.EntityFrameworkCore.Infrastructure.IInfrastructure)this.db.Members).Instance' 抛出类型为“System.NotImplementedException”的异常

我认为我的 project.json 文件中没有什么非常有趣的,但相关的行是:

"Pomelo.EntityFrameworkCore.MySql": "1.1.0",
"Pomelo.EntityFrameworkCore.MySql.Design": "1.1.0"

在 ConfigureServices 方法的 Startup.cs 中,我有这些语句:

string connectionString = Configuration.GetConnectionString("ManageRCNConnection");
services.AddDbContext<MembersContext>(options => options.UseMySql(connectionString));

现在事情很简单。

到目前为止,我的 Google-foo 让我在试图找出问题所在时感到失望。

谁能告诉我问题出在哪里?

谢谢!

更新:如果我按照@Tseng 的建议忽略结构中的错误,我第一次尝试从数据库中获取实体时会出错。

这是我的 MembersContext 的代码。我删除了一些属性,但它们只是更多的 DbSet 集合。

public class MembersContext : DbContext
{
    public MembersContext(DbContextOptions<MembersContext> options) : base(options)
    { }

    public DbSet<Member> Members { get; set; }
    public DbSet<FamilyMember> FamilyMembers { get; set; }
    public DbSet<Membership> Memberships { get; set; }
    ...
}

我没有使用上下文工厂,可能是这个问题吗?

【问题讨论】:

  • 您的问题/问题到底是什么?您不应该太认真地对待调试视图异常,除非您需要/必须访问此属性/方法。当在调试视图中展开时,Visual Studio 调试器将评估所有属性,因此如果其中一些没有实现,则不一定是坏信号。
  • 应该注意,虽然 Oracle 的 MySQL 提供程序比任何东西都具有更多的 alpha 状态,而且 Pomelo 最近更改为“更合法”的提供,因此它不再基于旧的 EF6 提供程序源:@987654322 @
  • 感谢@Tseng!问题是,如果我继续通过构造函数,第一次尝试访问任何数据时,我会遇到其他异常。这些更具体一些,特别是数据库中不存在表。所以显然有些地方是错误的,很可能在我的 MembersContext 定义中。我将更新我的问题以显示该代码。
  • 在启动过程中,您是否还在调用context.Database.EnsureCreated()(或context.Database.Migrate(),如果您使用迁移)或其异步变体?没有它,永远不会创建数据库
  • 正如我所提到的,我正在使用现有的数据库并且根本不打算使用迁移。我也相当有信心连接字符串是正确的;至少,它可以在服务器资源管理器中访问数据库。

标签: c# mysql asp.net-core entity-framework-core


【解决方案1】:

嗯,这是一个令人沮丧的过程,但我终于把这一切都解决了。非常感谢 @Tseng 提出的问题和 cmets,它们帮助我朝着正确的方向前进。

首先,我转而使用 Pomelo MySQL 提供程序。官方的 MySQL 提供程序是预发布的,但我认为至少可以开始这个新项目。不是,直到今天。 (Sapient Guardian 似乎也有可靠的提供者,但我不需要尝试。)

其次,我意识到我的对象上下文类有些地方不对劲,这是我的问题的根源。所以我回去让脚手架开始工作。我尝试了很多东西,但这就是我的 project.json 文件的依赖项部分的相关部分的最终结果:

"Microsoft.EntityFrameworkCore.Tools": "1.1.0-preview4-final",
"Microsoft.EntityFrameworkCore.Design": "1.1.0",
"Pomelo.EntityFrameworkCore.MySql": "1.1.1-prerelease-10000",
"Pomelo.Data.MySql": "1.0.0",
"Pomelo.EntityFrameworkCore.MySql.Design": "1.1.1-prerelease-10000" },

这似乎是脚手架和迁移所需的所有包,尽管我没有使用迁移。我不需要向文件的工具部分添加任何内容。

然后这个命令在 Visual Studio 2015 的包管理器控制台中工作:

Scaffold-DbContext "<connection string>" Pomelo.EntityFrameworkCore.MySql -OutputDir Models

瞧!正确的对象上下文以及实体类。 (我希望 dotnet ef 命令也可以,但没有尝试。)

在那之后,我遇到了一些“无法将'System.String'类型的对象转换为'System.Byte'类型”的问题。一个实体对象中的错误。原来是因为提供者(或者可能是 MySQL 连接器)在 .NET Core 中的字符字段和字符串存在一些问题。我将这些字段更改为 varchar,一切都很好。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
相关资源
最近更新 更多