Npg sql сопоставленное перечисление по-прежнему вызывает исключение при обновлении () - PullRequest
0 голосов
/ 26 мая 2020

У меня есть существующая база данных с таблицей, в которой используется PostgreSQL ENUM:

CREATE TYPE product_location_enum AS ENUM ('manufacture', 'Q.A.', 'stock', 'customer', 'scrapped');

И соответствующее C# определение:

enum ProductLocationEnum
{
    [PgName("manufacture")]
    manufacture,
    [PgName("Q.A.")]
    Q_A_,
    [PgName("stock")]
    stock,
    [PgName("customer")]
    customer,
    [PgName("scrapped")]
    scrapped,
}

Таблица загружается в DataGridView следующим образом:

NpgsqlConnection.GlobalTypeMapper.MapEnum<ProductLocationEnum>("product_location_enum");

string sQuery = "SELECT * FROM product";

DataTable DT = new DataTable();
conn = new NpgsqlConnection( conn_string );

conn.Open();

DataTable dt = new DataTable();
productDA = new NpgsqlDataAdapter();

productDA.SelectCommand = new NpgsqlCommand(sQuery, conn);

NpgsqlCommandBuilder builder = new NpgsqlCommandBuilder(productDA);
productDA.UpdateCommand = builder.GetUpdateCommand();

productDA.Fill(dt);
bindingSource = new BindingSource();
dgvProduct.DataSource = bindingSource;
bindingSource.DataSource = dt;

Чтобы зафиксировать изменения, внесенные в DataGridView, я делаю следующее (в настоящее время на button_click):

productDA.Update((DataTable)bindingSource.DataSource);

Это, к сожалению, вызывает исключение Npg sql .PostgresException :

invalid input value for enum product_location_enum: "4"

Я часами искал, что делаю неправильно, но не могу найти ответа. Некоторые из вещей, которые я пробовал:

  • Создайте свой собственный INpgsqlNameTranslator для перечисления. TranslateMemberName вызывается при загрузке, но НЕ при выполнении Update ().
  • Я пытался поиграть с UpdateCommand.Parameters [], но похоже, что метод Update () генерирует новую команду UpdateCommand, поскольку мои изменения полностью игнорируются и когда я проверяю UpdateCommand с прерванным отладчиком исключения, он полностью изменился по сравнению с исходным, предоставленным builder.GetUpdateCommand (). В этом есть смысл, поскольку он, вероятно, адаптирует его к изменяемым столбцам.

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

...