我试图让代码优先实体框架与现有的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所期望的带反引号的标识符?
已更新以包含配置设置
1条答案
按热度按时间chhqkbe11#
您需要配置框架生成器。
跟着这个。