使用 EF Core 搭建 MySql 数据库的问题 - 找不到方法:无效 Microsoft.EntityFrameworkCore.Storage.RelationalTypeMapping

Posted

技术标签:

【中文标题】使用 EF Core 搭建 MySql 数据库的问题 - 找不到方法:无效 Microsoft.EntityFrameworkCore.Storage.RelationalTypeMapping【英文标题】:Issue with scaffolding a MySql database with EF Core - Method not found: Void Microsoft.EntityFrameworkCore.Storage.RelationalTypeMapping 【发布时间】:2021-03-19 02:07:18 【问题描述】:

我正在尝试首先在 Visual Studio 2019 的 .NET Core 3.1 上使用 mysql.Data.EntityFrameworkCoreMicrosoft.EntityFrameworkCore 构建 MySql 数据库代码。但是,我不断收到以下错误:

找不到方法:'无效 Microsoft.EntityFrameworkCore.Storage.RelationalTypeMapping..ctor(System.String, System.Type, System.Nullable1<System.Data.DbType>, Boolean, System.Nullable1)'。

我在 GitHub 上查看了 EF Core 的源代码,但找不到与该签名匹配的方法 - 我是否遗漏了什么?

我的脚手架代码是:

dotnet ef dbcontext scaffold "Server=localhost;Database=database;Uid=myuid;" MySql.Data.EntityFrameworkCore -o Solution --project Solution.Project.Namespace

我也试过

dotnet ef dbcontext scaffold "Server=localhost;Database=database;Uid=myuid;" MySQL.Data.EntityFrameworkCore -o Solution --project Solution.Project.Namespace

我尝试通过 Developer PowerShell 和 Package Manager Console 运行这两个命令。结果一样。

我的 DbContext 是

using Solution.Data.Models;
using Microsoft.EntityFrameworkCore;
using MySQL.Data.EntityFrameworkCore; // I tried using MySql.Data.EntityFrameworkCore as well
using System;
using System.Collections.Generic;
using System.Text;

namespace Solution.Backend

    public class SolutionDBContext : DbContext
    
        public DbSet<User> Users  get; set; 
        public DbSet<Product> Products  get; set; 
        public DbSet<Journal> Journals  get; set; 
        public DbSet<JournalComment> JournalComments  get; set; 
        public DbSet<CartItem> CartItems  get; set; 
        public DbSet<Order> Orders  get; set; 

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        
            optionsBuilder.UseMySQL("Server=localhost;Database=database;Uid=myuid;");
        

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        
            base.OnModelCreating(modelBuilder);
        
    

我的 DbContext 代码位于名为 Solution.Backend 的项目中,而我的模型位于名为 Solution.Data

的项目中

如果我注释掉所有 DbSets 并尝试在 DbContext 中除了 OnConfiguringOnModelCreating 代码之外没有任何东西运行它,我会得到相同的结果。我是否遗漏了一些明显的东西,或者我遗漏了什么,或者这是一个已知的错误?我在任何地方都没有在网上找到有关此特定问题的任何信息。我很感激这里的一些帮助!提前致谢。

【问题讨论】:

确保您使用的是正确的命名空间。命名空间等同于文件夹名称,类等同于文件名。 VS 当你有一个唯一的类名时,编译器会自动找到它。当您有重复的类名时,您必须指定完整的命名空间和类名。 您能否更具体一点 - 哪个命名空间是问题?在dotnet ef dbcontext scaffold "Server=localhost;Database=database;Uid=myuid;" MySql.Data.EntityFrameworkCore -o *Solution* --project *Solution.Project.Namespace* 我尝试更改为 -o Solution.*Project*.*Namespace* 但它给了我同样的问题。 代码更改。我看起来类似于以下内容:Solution.Data.Solution.Backend.SolutionDBContext.Users 【参考方案1】:

MySql.Data.EntityFrameworkCore 8.0.22 仅与 Microsoft.EntityFrameworkCore 3.1 兼容。将所有 Microsoft.EntityFramework 包从 5.0.0 降级到 3.1.10 以修复错误。

随着 2021 年 1 月 18 日 MySQL Connector/NET 8.0.23 的发布,Oracle 现在发布了与 Microsoft.EntityFramework 5.0 兼容的不同 NuGet 包:MySql.EntityFrameworkCore。

请参阅table of version compatibility here。

或者,您可以尝试切换到Pomelo.EntityFrameworkCore.MySql 5.0.0-alpha.2(或更高版本);查看它的table of compatible package versions。

【讨论】:

我为这个问题受了两天的苦。你救了我的命。 这成功了:Install-Package Microsoft.EntityFrameworkCore.Tools -version 3.1.10 因为我真的离不开5.0.0,所以除了降级实体框架还有别的办法吗??? @KingKongBigBong 是的,改用MySql.EntityFrameworkCore 包。

以上是关于使用 EF Core 搭建 MySql 数据库的问题 - 找不到方法:无效 Microsoft.EntityFrameworkCore.Storage.RelationalTypeMapping的主要内容,如果未能解决你的问题,请参考以下文章

EF Core MySQL 数据库优先?

.Net EF Core千万级数据实践

MySQL 是不是与 EF Core 2.0 兼容?

将 EF Core 搭建到现有 DbContext 的脚手架

EF Core对象关系映射多种方法

EF Core使用CodeFirst在MySql中创建新数据库以及已有的Mysql数据库如何使用DB First生成域模型