使用EF Core的ASP.NET Core中使用MySQL提供程序的NotImplemented Exceptions

时间:2016-12-11 06:16:14

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

我正在构建一个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馆藏之一,使用会员POCO。 (顺便说一句,我并没有计划使用迁移,因此这不是一个因素。)这是上下文对象的状态,只要它被注入控制器,在我之前甚至尝试访问数据。

Locals Window when in controller constructor

典型信息的完整细节是:

  

((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; }
    ...
}

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

1 个答案:

答案 0 :(得分:1)

嗯,这是一个令人沮丧的过程,但我终于把它全部整理好了。非常感谢@Tseng的问题和评论,这有助于推动我朝着正确的方向前进。

首先,我转而使用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命令也能正常工作,但没有尝试过。)

之后,我遇到了一些问题&#34;无法转换类型&#39; System.String&#39;输入&#39; System.Byte&#39;。&#34;一个实体对象中的错误。结果是因为提供程序(或者MySQL连接器)在.NET Core中的char字段和字符串存在一些问题。我将这些字段更改为varchar,一切都很好。