Существует ли реализация IDictionary, которая, на недостающем ключе, возвращает значение по умолчанию вместо броска?

С точки зрения только стороны MySQL вашей реализации записи в таблице B не имеют «знания» о какой-либо записи в таблице A. В базе данных связь является однонаправленной

Встроенная каскадная функциональность существует для предотвращения ошибок внешнего ключа, указав БД, что делать при удалении записи, внешний ключ не будет указывать никуда. Удаление записи таблицы A не приведет к ошибке внешнего ключа ни в одной записи таблицы B, поэтому любые функции собственного каскада не сработают

Повторение; Вы не можете сохранить схему такой же, и каскадное удаление из a в b, потому что у вас нет каскадного удаления из a в b

[1113 ] Вы также упомянули в комментариях, что некоторые записи таблицы B могут существовать без записей таблицы A, чего нет в исходном вопросе

Чтобы получить автоматическое удаление описанных вами записей таблицы B, у вас есть несколько вариантов Что касается БД:

  1. Поменяйте местами отношение через - Удалите текущий внешний ключ и добавьте столбец внешнего ключа, который можно обнулять, в таблице B, который ссылается на первичный ключ таблицы A. Затем вы можете поместить каскадное удаление в этот внешний ключ. Оставьте новый столбец пустым для записей таблицы B, которые не принадлежат записи таблицы A. Вы также можете добавить уникальный индекс в этот столбец для защиты отношения один-к-одному
  2. Добавить триггер БД - При удалении записи таблицы A добавьте триггер БД, который удаляет ссылку запись таблицы B
  3. Добавление процедуры БД - добавление процедуры, которая удаляет запись таблицы A, а затем, по очереди, ссылку на запись таблицы B, возможно, в рамках транзакции. В дальнейшем удаляем только записи таблицы А, используя процедуру
  4. . Не решайте проблему на уровне БД - в основном то же, что и в варианте 3, но перемещайте логику процедуры из БД. слой в логику приложения

Может быть что-то в JPA, что решает вашу дилемму из коробки, но под капотом это будет делать одно из перечисленных выше (не вариант 1, а, вероятно, вариант 4)

115
задан Marcel 18 February 2015 в 15:01
поделиться

2 ответа

Действительно, это не будет эффективно вообще.

Вы могли всегда писать дополнительный метод:

public static TValue GetValueOrDefault<TKey,TValue>
    (this IDictionary<TKey, TValue> dictionary, TKey key)
{
    TValue ret;
    // Ignore return value
    dictionary.TryGetValue(key, out ret);
    return ret;
}

Или с C# 7.1:

public static TValue GetValueOrDefault<TKey,TValue>
    (this IDictionary<TKey, TValue> dictionary, TKey key) =>
    dictionary.TryGetValue(key, out var ret) ? ret : default;

, Который использует:

  • метод с телом выражения (C# 6)
  • переменная (C# 7.0)
  • литерал значения по умолчанию А (C# 7.1)
133
ответ дан Jon Skeet 24 November 2019 в 02:27
поделиться

Нет, потому что иначе, как Вы знали бы различие, когда ключ существует, но сохранил нулевое значение? Это могло быть значительно.

-1
ответ дан Joel Coehoorn 24 November 2019 в 02:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: