Проверьте код ниже, RandomMan.MyRandomString(64) генерирует случайную строку из 64 символов.

Теперь я хочу проверить, уникальна ли эта случайная строка в базе данных, используя запрос entityframework, как показано ниже. И если эта строка не уникальна в базе данных, он будет продолжать цикл do, пока не найдет уникальную случайную строку. Теперь мой вопрос: правильно ли я это делаю? Или есть лучший способ?

string randstr;
do {
    randstr = RandomMan.MyRandomString(64);
} while (DataCtx.StorageFiles.Any(x => x.AwsUniqueFileName == randstr));
-1
john Cogdle 20 Сен 2018 в 03:51

2 ответа

Лучший ответ

Я не могу сказать, правильно ли вы это делаете, но если у вас уже есть строка в БД, я мог бы предложить объединить (добавить) ваше поле идентификации id в созданную строку, чтобы вы могли убедиться, что результат уникален в БД, учитывая, что ваш MyRandomString производит только символы (или без чисел в конце)

Допустим, ваша сгенерированная строка - abc, а id строки, которую вы обновляете, - 53, тогда ваша последняя уникальная строка будет abc53

3
Bakri Bitar 20 Сен 2018 в 01:10

Стандартный подход для этого - просто сгенерировать GUID:

Console.WriteLine(Guid.NewGuid());

Он разработан так, чтобы быть уникальным, и маловероятно, что он будет генерировать два идентичных GUID даже во многих экземплярах одновременно, поэтому вам не нужно сильно беспокоиться об атомарности этой операции.

Вероятность коллизии настолько мала, что вы можете вообще не обрабатывать ее, но просто чтобы убедиться, что вы можете установить уникальный ключ в этом столбце и рассматривать его как исключение, нет необходимости в цикле.

3
Adassko 20 Сен 2018 в 01:21