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

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

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

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;
}

Ответы [ 3 ]

7 голосов
/ 13 марта 2009

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

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

1 голос
/ 13 марта 2009

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

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

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

EDIT В обновленном коде вы не можете перехватить исключение, которое будет вызвано методом «AddToXXXXXX».

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

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

   }
}

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

0 голосов
/ 13 марта 2009

Вы можете заменить первый Try-Catch на оператор If, но я думаю, что вам все равно понадобится второй.

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

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

...