Почему поставщик EF6 не может цитировать имена столбцов в ссылках на внешнее ключ для составных ключей с зарезервированнMySql

Форум по Mysql
Ответить
Anonymous
 Почему поставщик EF6 не может цитировать имена столбцов в ссылках на внешнее ключ для составных ключей с зарезервированн

Сообщение Anonymous »

Продукт: mysql.data.entityframework
версия: 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 при создании схемы базы данных из модели (

    Код: Выделить всё

    ObjectContext.CreateDatabaseScript()
    ). Ошибка возникает, когда внешняя ключа ограничение ссылается на составной первичный ключ , который содержит имя столбца, которое также является зарезервированным ключевым словом MySQL (например, ключ ). Сгенерированный сценарий DDL пропускает необходимые обратные ножки вокруг имен столбцов в предложении «Список лицензий» < /code>, вызывая MySQLEXCEPTION < /code> (ошибка синтаксиса), когда сценарий выполняется. Ключи : создать EF6 DBContext с моделью, содержащей как минимум две пары сущностей, где составной ключ включает в себя зарезервированное ключевое слово.

    case 1: hountity Properties с композитным первичным ключом (bnr, bkey, iks_pkey). Столбец Bkey конфликтует с ключом MySQL зарезервированным ключом .
  • case 2: apikeys с составной первичной ключом (id, ключ, iks_pkey) . Ключ столбца является зарезервированным ключевым словом.
[*] Определить объекты ссылки : Создать соответствующие объекты (

Код: Выделить всё

ActivationCodes
, apikeypermissions ), которые имеют отношения иностранных ключей, указывающие на составные клавиши, определенные выше.

Код: Выделить всё

// 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 `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;
Пример для apikeys :

Код: Выделить всё

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 () ) для любых моделей данных, которые включают в себя модель данных, которые включают в себя модель обработки данных, которые включают в себя заповедные слова. Это значительно препятствует разработке и особенно проблематично для настройки автоматических средств тестирования, в которых базы данных создаются и снимаются динамически.


Подробнее здесь: https://stackoverflow.com/questions/797 ... nces-for-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «MySql»