версия: 8.4.0
среда:
- />mysql.data: 8.4.0 < /li>
mysql.data.entityframework: 8.4.0 < /li>
Целевая база данных: mysql 8.0+< /li>
< /ul>
rummary < /h3 < /h3> < /h3> < /h3> < /h3> < /h3 < /h3> < /h3 < /h3> < /ul>
< /h3 < /hr /h3 < /h3> < /ul>
< /li>. Mysql.data.entityframework поставщик для предприятия Framework 6 генерирует синтаксически неверный SQL при создании схемы базы данных из модели (). Ошибка возникает, когда внешняя ключа ограничение ссылается на составной первичный ключ , который содержит имя столбца, которое также является зарезервированным ключевым словом MySQL (например, ключ ). Сгенерированный сценарий DDL пропускает необходимые обратные ножки вокруг имен столбцов в предложении «Список лицензий» < /code>, вызывая MySQLEXCEPTION < /code> (ошибка синтаксиса), когда сценарий выполняется. Ключи : создать EF6 DBContext с моделью, содержащей как минимум две пары сущностей, где составной ключ включает в себя зарезервированное ключевое слово.Код: Выделить всё
ObjectContext.CreateDatabaseScript()
case 1: hountity Properties с композитным первичным ключом (bnr, bkey, iks_pkey). Столбец Bkey конфликтует с ключом MySQL зарезервированным ключом . - case 2: apikeys с составной первичной ключом (id, ключ, iks_pkey) . Ключ столбца является зарезервированным ключевым словом.
Код: Выделить всё
ActivationCodesКод: Выделить всё
// Example Entity Definitions
public class Properties
{
[Key, Column(Order = 0)]
public short BNr { get; set; }
[Key, Column(Order = 1)]
public int BKey { get; set; } // 'KEY' is a reserved word
[Key, Column(Order = 2)]
public string IKS_PKey { get; set; }
}
public class ActivationCodes
{
public int Id { get; set; }
public virtual Properties Property { get; set; }
}
public class ApiKeys
{
[Key, Column(Order = 0)]
public int Id { get; set; }
[Key, Column(Order = 1)]
public Guid Key { get; set; } // 'KEY' is a reserved word
[Key, Column(Order = 2)]
public string IKS_PKey { get; set; }
}
public class ApiKeyPermissions
{
public int Id { get; set; }
public virtual ApiKeys ApiKey { get; set; }
}
Код: Выделить всё
using (var context = new MyDbContext())
{
string ddlScript = ((IObjectContextAdapter)context).ObjectContext.CreateDatabaseScript();
// At this point, inspect the 'ddlScript' string.
}
< /code>
< /li>
< /ol>
ожидаемое поведение < /h3>
Сгенерированный внешний ключ < /code> ограничение в сценарии DDL должно правильно указать все названия колонн. Свойства Код: Выделить всё
ALTER TABLE `ActivationCodes` ADD CONSTRAINT `ActivationCode_Property`
FOREIGN KEY (`Property_BNr`, `Property_BKey`, `Property_IKS_PKey`)
REFERENCES `Properties` (`BNr`, `BKey`, `IKS_PKey`) -- Correctly quoted
ON DELETE Cascade ON UPDATE NO ACTION;
Код: Выделить всё
ALTER TABLE `apikeypermissions` ADD CONSTRAINT `ApiKeyPermission_ApiKey`
FOREIGN KEY (`ApiKeyId`, `ApiKeyKey`, `ApiKeyIksPKey`)
REFERENCES `ApiKeys` (`Id`, `Key`, `IKS_PKey`) -- Correctly quoted
ON DELETE Cascade ON UPDATE NO ACTION;
Провайдер генерирует скрипт, в котором имена столбцов в предложении не цитируются, что приводит к ошибке синтаксиса SQL, потому что Bkey и ключ интерпретируются как Keywords. Press>
Prong Press. SQL (неверный):
Код: Выделить всё
-- For Properties
REFERENCES `Properties` (BNr, BKey, IKS_PKey)
-- For ApiKeys
REFERENCES `ApiKeys` (Id, Key, IKS_PKey)
< /code>
Когда этот скрипт выполняется против сервера MySQL, он не работает с mysql.data.mysqlclient.mysqlexception < /code>: < /p>
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Key, IKS_PKey) ON DELETE Cascade ON UPDATE NO ACTION' at line 3< /code> < /p>
< /blockquote>
SkaryParny < /h3>
Единственный жизнеспособный обходной путь-это выполнение замены строки на сгенерированном сценарии перед выполнением, используя регулярные выражения, чтобы найти и исправить ссылки < /code> claus. PrettyPrint-Override ">// 1. Generate the buggy DDL script.
var dbCreationScript = ((IObjectContextAdapter)context).ObjectContext.CreateDatabaseScript();
// 2. Fix the reference to the `Properties` table.
dbCreationScript = Regex.Replace(
dbCreationScript,
@"REFERENCES\s+`?Properties`?\s*\(\s*BNr\s*,\s*BKey\s*,\s*IKS_PKey\s*\)",
"REFERENCES `Properties` (`BNr`, `BKey`, `IKS_PKey`)",
RegexOptions.IgnoreCase);
// 3. Fix the reference to the `ApiKeys` table.
dbCreationScript = Regex.Replace(
dbCreationScript,
@"REFERENCES\s+`?ApiKeys`?\s*\(\s*Id\s*,\s*Key\s*,\s*IKS_PKey\s*\)",
"REFERENCES `ApiKeys` (`Id`, `Key`, `IKS_PKey`)",
RegexOptions.IgnoreCase);
// 4. Execute the corrected script.
var createScript = new MySql.Data.MySqlClient.MySqlScript(connection, dbCreationScript);
createScript.Execute();
Эта ошибка предотвращает использование любых функций генерации автоматической схемы на основе EF6 (например, база данных.create () , созданный атабазейфнотексексы или createdAtabasascript () ) для любых моделей данных, которые включают в себя модель данных, которые включают в себя модель обработки данных, которые включают в себя заповедные слова. Это значительно препятствует разработке и особенно проблематично для настройки автоматических средств тестирования, в которых базы данных создаются и снимаются динамически.
Подробнее здесь: https://stackoverflow.com/questions/797 ... nces-for-c