2015-08-03 1 views
2

Я использую Entity Framework, поэтому считаю, что я должен поймать NpgsqlException, поскольку это поставщик данных .NET для PostgreSQL. Итак, допустим, я делаю запрос к контексту. Если таблица не существует в базе данных PostgreSQL, я хочу уловить созданное исключение, а затем вручную создать его. Приведенный ниже код является примером того, как вставляется сущность, и я попытался использовать обработку ошибок, чтобы создать таблицу, если это необходимо:Как поймать исключение и использовать коды ошибок, если запрашиваемая таблица PostgreSQL не найдена?

try 
{ 
    return _context.Set(entityType).Add(entity); 
} 
catch (NpgsqlException) 
{ 
    CreateEntityTable(entity); //a private method I made 
    return _context.Set(entityType).Add(entity); 
} 

Проблемы:

  • Я не 100% уверен, что я должен поймать NpgsqlException

  • Я хочу быть уверенным, что если возникает исключение, это связано с тем, что таблица не существует. Я искал the PostgreSQL documentation of error codes, а код ошибки 42P01 - неопределенная таблица. Я считаю, что хочу использовать это, но как? Я посмотрел the members of the NpgsqlException class, и я нашел ErrorCode. Однако это тип int. Было бы хорошо, если бы я мог изменить код выше, чтобы быть похожим на следующий

    try 
    { 
        return _context.Set(entityType).Add(entity); 
    } 
    catch (NpgsqlException ex) 
    { 
        if (ex.ErrorCode.Equals(42P01)) 
        { 
         CreateEntityTable(entity); //a private method I made 
         return _context.Set(entityType).Add(entity); 
        } 
    } 
    

Но я не уверен, если это имеет смысл (я даже не знаю, как 42P01 может быть Int) ,

Любая помощь будет оценена по достоинству.

ответ

2

Вы должны использовать свойство Code для NpgsqlException, поскольку оно будет содержать код ошибки PostgreSql.

Обновление пример:

try 
{ 
    return _context.Set(entityType).Add(entity); 
} 
catch (NpgsqlException ex) 
{ 
    if (ex.Code == "42P01") 
    { 
     CreateEntityTable(entity); //a private method I made 
     return _context.Set(entityType).Add(entity); 
    } 
} 

Как и в сторону, я хотел бы предложить, что вы не будете выполнять обновления схемы в вашем обычном коде. Только делайте что-то подобное в установщике или при запуске в качестве обновления.

+0

А я пропустил член «Code» - я искал «ErrorCode» и «ErrorSql», поэтому я не видел «Code», спасибо! Также мне нужно выполнить обновления схемы, потому что в моем контексте класса я устанавливаю значение «Database.SetInitializer» равным нулю, поэтому мне приходится вручную создавать и изменять таблицы. Я не буду вникать в причину, но это связано с тем, что динамически генерирует классы сущностей и классы контекста с помощью CodeDom - это довольно уродливо. – Drew

+1

Также я должен обратить внимание на всех, кто может найти это полезным, и также использует Entity Framework, что вы не можете напрямую поймать 'NpgsqlException'. Сначала вам нужно поймать 'EntityCommandExecutionException', а затем использовать' ex.InnerException', чтобы получить 'NpgsqlException'. Я просто проверил это. – Drew