Я пытаюсь сначала получить код Entity Framework для работы с существующей базой данных MySQL. Я получил Entity Framework v6.2.0 и MySQL.Data.Entity v6.9.11 от NuGet. Я пробовал 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, использует синтаксис, оптимизированный для SQL Server, который не работает для MySQL.
SQL, который сгенерировал Entity Framework, был:
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 для базы данных, я получаю ожидаемые результаты. Я не могу изменить способ, которым база данных ожидает, что идентификаторы будут заключены в кавычки, потому что уже существуют устаревшие программы, которые должны продолжать работать и принимать этот синтаксис. Поэтому мне нужно получить Entity Framework для генерации SQL, который будет работать с существующей базой данных.
Как получить Entity Framework для генерации SQL с идентификаторами в кавычках, ожидаемыми MySQL?
Обновлено, чтобы включить параметры конфигурации