< /li>. Mysql.data.entityframework поставщик для предприятия Framework 6 генерирует синтаксически неверный SQL при создании схемы базы данных из модели (
). Ошибка возникает, когда внешняя ключа ограничение ссылается на составной первичный ключ , который содержит имя столбца, которое также является зарезервированным ключевым словом MySQL (например, ключ ). Сгенерированный сценарий DDL пропускает необходимые обратные ножки вокруг имен столбцов в предложении «Список лицензий» < /code>, вызывая MySQLEXCEPTION < /code> (ошибка синтаксиса), когда сценарий выполняется. Ключи : создать EF6 DBContext с моделью, содержащей как минимум две пары сущностей, где составной ключ включает в себя зарезервированное ключевое слово.
case 1: hountity Properties с композитным первичным ключом (bnr, bkey, iks_pkey). Столбец Bkey конфликтует с ключом MySQL зарезервированным ключом .
case 2: apikeys с составной первичной ключом (id, ключ, iks_pkey) . Ключ столбца является зарезервированным ключевым словом.
[*] Определить объекты ссылки : Создать соответствующие объекты (
// 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; }
}
Сгенерировать сценарий DDL : используйте метод createdAtaBasScript () для генерации схемы.
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 `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();
Impact
Эта ошибка предотвращает использование любых функций генерации автоматической схемы на основе EF6 (например, база данных.create () , созданный атабазейфнотексексы или createdAtabasascript () ) для любых моделей данных, которые включают в себя модель данных, которые включают в себя модель обработки данных, которые включают в себя заповедные слова. Это значительно препятствует разработке и особенно проблематично для настройки автоматических средств тестирования, в которых базы данных создаются и снимаются динамически.
< /li>. Mysql.data.entityframework поставщик для предприятия Framework 6 генерирует синтаксически неверный SQL при создании схемы базы данных из модели ([code]ObjectContext.CreateDatabaseScript()[/code]). Ошибка возникает, когда внешняя ключа ограничение ссылается на составной первичный ключ , который содержит имя столбца, которое также является зарезервированным ключевым словом MySQL (например, ключ ). Сгенерированный сценарий DDL пропускает необходимые обратные ножки вокруг имен столбцов в предложении «Список лицензий» < /code>, вызывая MySQLEXCEPTION < /code> (ошибка синтаксиса), когда сценарий выполняется. Ключи : создать EF6 DBContext с моделью, содержащей как минимум две пары сущностей, где составной ключ включает в себя зарезервированное ключевое слово.
[b] case 1: [/b] hountity Properties с композитным первичным ключом (bnr, bkey, iks_pkey). Столбец Bkey конфликтует с ключом MySQL зарезервированным ключом . [*] [b] case 2: [/b] apikeys с составной первичной ключом (id, ключ, iks_pkey) . Ключ столбца является зарезервированным ключевым словом. [/list]
[*] [b] Определить объекты ссылки [/b]: Создать соответствующие объекты ([code]ActivationCodes[/code], apikeypermissions ), которые имеют отношения иностранных ключей, указывающие на составные клавиши, определенные выше.[code]// 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; } } [/code]
[b] Сгенерировать сценарий DDL [/b]: используйте метод createdAtaBasScript () для генерации схемы.[code]using (var context = new MyDbContext()) { string ddlScript = ((IObjectContextAdapter)context).ObjectContext.CreateDatabaseScript(); // At this point, inspect the 'ddlScript' string. } < /code> < /li> < /ol>
ожидаемое поведение < /h3> Сгенерированный внешний ключ < /code> ограничение в сценарии DDL должно правильно указать все названия колонн. Свойства [/code]: [code]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; [/code] [b] Пример для apikeys : [/b] [code]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; [/code]
Фактическое поведение Провайдер генерирует скрипт, в котором имена столбцов в предложении [b] не [/b] цитируются, что приводит к ошибке синтаксиса SQL, потому что Bkey и ключ интерпретируются как Keywords. Press> Prong Press. SQL (неверный): [code]-- 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(); [/code] Impact Эта ошибка предотвращает использование любых функций генерации автоматической схемы на основе EF6 (например, база данных.create () , созданный атабазейфнотексексы или createdAtabasascript () ) для любых моделей данных, которые включают в себя модель данных, которые включают в себя модель обработки данных, которые включают в себя заповедные слова. Это значительно препятствует разработке и особенно проблематично для настройки автоматических средств тестирования, в которых базы данных создаются и снимаются динамически.