Mapeando seus tipos de CLR
Ainda é possível, e em alguns casos necessário, configurar um mapeamento explícito para seus tipos CLR. Fazer isso oferece as seguintes vantagens:
Você sabe que precisa especificar a propriedade DataTypeName em seu parâmetro. O Npgsql inferirá o tipo de dados do seu tipo CLR fornecido.
Métodos de leitura sem tipo, como NpgsqlDataReader.GetValue(), retornarão seu tipo CLR, em vez de um objeto dinâmico (veja abaixo). Em geral, você deve usar o tipo NpgsqlDataReader.GetFieldValue(), então isso não deve ser importante.
Você pode personalizar o mapeamento de nome por tipo (veja abaixo). Para configurar um mapeamento global para todas as suas conexões, coloque este código antes de sua primeira abertura:
NpgsqlConnection.GlobalTypeMapper.MapEnum<SomeEnum>("some_enum");
NpgsqlConnection.GlobalTypeMapper.MapComposite<SomeType>("some_composite");
Se você não quiser configurar um mapeamento para todas as suas conexões, poderá configurar apenas uma conexão:
var conn = new NpgsqlConnection(...);
conn.TypeMapper.MapEnum<SomeEnum>("some_enum");
conn.TypeMapper.MapComposite<SomeType>("some_composite");
http://www.npgsql.org/doc/types/enums_and_composites.html