MySQL 8.0.22 + EntityFramework -表不存在(数据库/模式两次)

c6ubokkw  于 2022-11-28  发布在  Mysql
关注(0)|答案(4)|浏览(169)

我的ASP.NET网站使用的是EntityFramework,之前使用的是MsSQL,运行良好。现在我尝试从MsSQL迁移到MySQL(使用MySQL Workbench 8.0.22的迁移向导将数据库从MySQL迁移到了MsSQL)。以下是我的设置:

  • Visual Studio 2019社区版16.6.1
  • Visual Studio扩充功能:适用于Visual Studio 8.0.22的MySQL
  • MySQL服务器8.0.22
  • 连接器/NET 8.0.22
  • 连接器/ODBC 8.0.22
  • 实体框架6.4.4
  • 数据库管理系统
  • MySql.数据.实体框架8.0.22

我可以从我的MySQL数据库/模式“test”中使用EntityFrameWork创建实体。但是当我尝试使用实体时,我得到了以下错误:
表'test.test.tbl_grouppermissions'不存在
我猜问题是,它试图访问表“tbl_grouppermissions”,其中包含两次数据库/模式名称(test.test)。
我已经检查了表名是否正确。
我的网页配置:

<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.EntityFramework, Version=8.0.22.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </providers>
</entityFramework>
<connectionStrings>
  <add name="testConnectionString" connectionString="server=localhost;port=3306;database=test;user id=root;password=******;" providerName="MySql.Data.MySqlClient" />
  <add name="testMySQLEntities" connectionString="metadata=res://*/Entities.MySQLModel.csdl|res://*/Entities.MySQLModel.ssdl|res://*/Entities.MySQLModel.msl;provider=MySql.Data.MySqlClient;provider connection string=&quot;server=localhost;port=3306;user id=root;password=******;database=test;persistsecurityinfo=True&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

错误出现在以下部分(testEntities.tbl_groupsstatus.Where):

public bool hasGuestStatus(int statusId)
{
    List<tbl_groupsstatus> statis = testEntities.tbl_groupsstatus.Where(p => p.groupId == (int)ProtectedGroups.Gast).ToList();
    bool hasStatus = false;
    foreach (tbl_groupsstatus status in statis)
    {
        if (status.statusId == statusId) { hasStatus = true; }
    }
    return hasStatus;
}

堆栈跟踪告诉我,它使用了正确的驱动程序:

[MySqlException (0x80004005): Table 'test.test.tbl_groupspermissions' doesn't exist]
   MySql.Data.MySqlClient.MySqlStream.ReadPacket() +309
   MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId) +67
   MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affectedRows, Int64& insertedId) +17
   MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force) +110
   MySql.Data.MySqlClient.MySqlDataReader.NextResult() +931
   MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) +1636
   MySql.Data.EntityFramework.EFMySqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +33

我在这里看到了版本8.0.22的相关问题,但没有任何令我满意的解决方案:
Table 'dbname.dbname.tablename' doesn't exists error in Visual Studio when adding Mysql Entity Framework
VS 2019和MySQL实体框架重复的数据库名称
Schema/DB Name added 2 times in EF for MYSQL DB
Entity framework migration "Table does not exist"
谢谢你的帮助。

UPDATE正如Bradley Grainger所提到的,它可能是组件MySql.Data.EntityFramework 8.0.22的bug。降级到MySql.Data.EntityFramework 8.0.21为我解决了这个问题。

mrfwxfqh

mrfwxfqh1#

1.关闭Visual Studio项目
1.使用记事本编辑MySQLModel.edmx文件
1.替换文件中从Schema=“Test”到Schema="”的匹配项
1.保存MySQLModel.edmx文件
1.打开visual studio项目
1.编译项目
1.执行应用程序

weylhg0b

weylhg0b2#

这是MySql.Data.EntityFramework 8.0.22中的一个已知错误:Bug 101236
您可以通过将MySql.Data.EntityFramework降级到8.0.21来解决此问题。

rjee0c15

rjee0c153#

我在此设置中遇到了同样的问题:
-MySQL服务器8.0.25

  • 用于Visual Studio 8.0.25的MySQL-连接器/NET 8.0.25
    -NuGet:实体框架6.4.4
    -NuGet:我的SQL数据库8.0.25
    -NuGet:MySql.数据.实体框架8.0.25
    对我来说,解决方案是重新安装MySQL for Visual Studio扩展,并修改MySQLModel.edmx文件,就像在@adamskorp回答中一样。也许是安装上的bug之类的。
lrl1mhuk

lrl1mhuk4#

我有3张table有这个问题,而其他的都很好...
已检查生成的edmx文件(DB-First-Approach),它们的条目不同,原因如下:
工作行数:

<EntitySet Name="Unit" EntityType="Self.Unit" Schema="db_test" store:Type="Tables" />
<EntitySet Name="User" EntityType="Self.User" Schema="db_test" store:Type="Tables" />
<EntitySet Name="User_to_Role" EntityType="Self.User_to_Role" Schema="db_test" store:Type="Tables" />

导致问题的表定义为:

<EntitySet Name="TaggedSearchResult" EntityType="Self.TaggedSearchResult" store:Type="Tables" store:Schema="db_test">
            <DefiningQuery>SELECT
`TaggedSearchResult`.`MatchPrimaryKeyValue`, 
`TaggedSearchResult`.`PredicatePrimaryKeyValue`, 
`TaggedSearchResult`.`PredicateEntityName`, 
`TaggedSearchResult`.`PredicateEntityColumn`, 
`TaggedSearchResult`.`PredicateKeyWord`
FROM `db_test.TaggedSearchResult` AS `TaggedSearchResult`</DefiningQuery>
          </EntitySet>

我不知道,为什么这3个表导致一个不同的标记-但只是修改它看起来像第一个表示和一切工作的预期。

相关问题