暗黙のテーブル型に基づいてカスタム(複合)型を返そうとしています。Npgsqlとストアドプロシージャからカスタムテーブルタイプを返す方法は?
私はこのテーブル定義を持っている:
public class ApplicationUser
{
public string Id { get; set; }
public string Name { get; set; }
}
呼び出すことによってマップされます:
NpgsqlConnection.MapCompositeGlobally<ApplicationUser>("app_user");
そして、私がしようとしている。このクラス定義にマッピングされ
CREATE TABLE app_user (id CHAR(36) PRIMARY KEY, name TEXT);
このストアドプロシージャを使用してレコードを返す:
私はこのようなC#のから呼んでいるCREATE FUNCTION find_by_id(user_id app_user.id%TYPE) RETURNS app_user AS $$
DECLARE
found_user app_user;
BEGIN
SELECT *
FROM app_user
WHERE id = user_id
INTO found_user;
RETURN found_user;
END
$$ LANGUAGE plpgsql STABLE SECURITY DEFINER;
:
ApplicationUser user;
using (NpgsqlConnection db = new NpgsqlConnection(this.connectionString))
{
db.Open();
using (NpgsqlCommand cmd = new NpgsqlCommand("find_by_id", db))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("user_id", userId);
object result = cmd.ExecuteScalar();
user = result == DBNull.Value ? null : (ApplicationUser)result;
}
}
しかしApplicationUser
にresult
をキャストするとき、私は例外を取得:
InvalidCastException: Unable to cast object of type 'System.String' to type 'MyApp.ApplicationUser'.
result
は単なる文字列であるので、これは明らかにされId
しかし、なぜresult
私の複合app_user
オブジェクトがないのですか?
私はまたoutパラメータでオブジェクトを返そうとしましたが、まったく同じ例外が発生しました。私はNpgsqlを使って何をしようとしているのですか、あるいは個々の列からC#で手動でApplicationUser
オブジェクトを再構築する必要がありますか?
私はNpgsql v3.2.0とPostgreSQL v9.6を使用しています。