Можно ли полагаться на try-catch в методе CreateOrUpdate для Entity Framework?

StackOverflow https://stackoverflow.com/questions/643731

Вопрос

Приемлемо ли это делать?Сначала попробуйте добавить объект.Если добавить не удается, это не имеет значения, потому что это означает, что объект уже существует?

Или есть более элегантное / простое решение?

EntityFrameworkEntities dal = EntityDataModelHelper.GetEntityDataModel();

try
{
    dal.AddToXXXXXX(xxxxxxx);
}
catch
{

}

try
{
    dal.SaveChanges();
    return true;
}
catch
{
    return false;
}

Хорошо, я сократил его до...

EntityFrameworkEntities dal = EntityDataModelHelper.GetEntityDataModel();

if(xxxxxxx.ID == 0)
{
    dal.AddToXXXXXX(xxxxxxx);
}

try
{
    dal.SaveChanges();
    return true;
}
catch
{
    return false;
}
Это было полезно?

Решение

Конечно, не нормально. Оператор catch без типа в C # означает «поймать любое стандартное или нестандартное исключение». Но вы намерены не допустить дублирования Add. Добавление может быть неудачным по ряду причин, которые не указывают на существующую запись. Например, этот метод может выдавать нулевую ссылку, и вы предполагаете, что она была добавлена.

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

Другие советы

Вы бы хотели начать с метода в стиле IfExists, а затем пропустить сохранение ваших изменений, если у вас действительно нет изменений.

Как отметил Лукас, блоки try-catch имеют большие накладные расходы, если вы попадаете в блок catch, поэтому, как правило, вы не хотите полагаться на это, если только нет возможного способа определить, существует ли элемент уже.

Не используйте try-catch для выполнения работы оператора If.Try-catch предназначен для необычных, непредвиденных событий.

Редактировать В вашем обновленном коде вам не удается перехватить исключение, которое было бы сгенерировано методом "AddToXXXXXX".

Вы должны сделать

If(!XXXXXX.Contains(newItemValue))
{
   try
   {
      add...
      savechanges...
   }
   catch
   {

   }
}

в качестве альтернативы, вы могли бы разделить Add и Savechanges на разные блоки try-catch, но это необходимо только в том случае, если SaveChanges выполняется даже при сбое Add.

Вы могли бы заменить первую попытку Catch на оператор If, но я думаю, что вам все равно понадобится вторая.

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

P.S.Блоки Try Catch используют больше вычислительной мощности (времени), чем операторы If.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top