获取实体框架以生成带有mysql所期望的backtick标识符的sql

czq61nw1  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(409)

我试图让代码优先实体框架与现有的mysql数据库一起工作。我从nuget获得了entityframeworkv6.2.0和mysql.data.entityv6.9.11。我确实尝试过mysql.data.entity v6.10.7,但在被与此问题相同的继承安全规则问题阻止后,我恢复到了6.9.11。
配置包含以下内容(由于明显的原因删除了用户名和密码):

<connectionStrings>
    <add name="MySql" providerName="MySql.Data.MySqlClient" connectionString="SERVER=sql-dev;Database=pen;UID=****;PWD=****;Allow User Variables=True;" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.11.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <remove invariant="MySql.Data.MySqlClient" />
      <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.11.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data>

通过恢复到v6.9.11,我可以查询dbset并查看它在调试器中生成的sql。我可以连接,并且它识别出模式是正确的,但是当我尝试执行一个简单的测试查询时,它失败了。

Assert.IsTrue(context.BinLocs.Count() > 0);

通过使用调试器,我发现它失败了,因为它生成的sql查询使用了为sqlserver优化的语法,而sqlserver不适用于mysql。
实体框架生成的sql为:

SELECT 
    [Extent1].[TID] AS [TID], 
    [Extent1].[zone] AS [zone], 
    [Extent1].[ProdCode] AS [ProdCode], 
    [Extent1].[chute] AS [chute]
FROM [dbo].[tbl_s_products_binlocs] AS [Extent1];

不幸的是,数据库被设置为使用`作为引号标识符,并且没有dbo模式。知道了这一点,我可以通过手动更改sql来考虑这一点,从而轻松地使此sql正常工作:

SELECT 
    `Extent1`.`TID` AS `TID`, 
    `Extent1`.`zone` AS `zone`, 
    `Extent1`.`ProdCode` AS `ProdCode`, 
    `Extent1`.`chute` AS `chute`
FROM `tbl_s_products_binlocs` AS `Extent1`;

当我对数据库运行这个sql时,我得到了预期的结果。我不能改变数据库期望引用标识符的方式,因为已经有遗留程序必须保持运行并采用这种语法。所以我需要实体框架来生成sql,它将与现有的数据库一起工作。
如何让实体框架生成sql,并使用mysql所期望的带反引号的标识符?
已更新以包含配置设置

chhqkbe1

chhqkbe11#

您需要配置框架生成器。
跟着这个。

相关问题