web-dev-qa-db-ja.com

EF 4.3のパラメーターでストアドプロシージャを実行すると、オブジェクトタイプSystem.Collections.Generic.Listからのマッピングが存在しない

最近、私はストアドプロシージャに取り組んでいて、1つの奇妙な問題に遭遇しました。

まず、データベースからストアドプロシージャを正常に呼び出すことができました。

IList <XXXViewModel> XXXList = _context.Database.SqlQuery( "spXXX")。ToList();

しかし、パラメーターを渡す必要があるときは失敗しました。

var parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter("param1", param1Value));
parameters.Add(new SqlParameter("param2", param2Value));
IList<XXXViewModel> XXXList =
_context.Database.SqlQuery<XXXViewModel>("spXXX @param1, @param2", parameters).ToList();

そして、私はff、エラーを得ました:

オブジェクトタイプSystem.Collections.Generic.List`1 [[System.Data.SqlClient.SqlParameter、System.Data、Version = 4.0.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089]]から既知のマネージプロバイダーネイティブへのマッピングは存在しませんタイプ。

私も試したことに注意してください:

_context.Database.ExecuteSqlCommand<EXEC XXXViewModel>("spXXX @param1, @param2", parameters).ToList();

しかし、同じ結果を得ました:-(。

また、各パラメーターを指定して、呼び出しを試みました。

IList<XXXResult> query = Context.Database.SqlQuery<XXXResult>("SP @paramA, @paramB, @paramC", new SqlParameter("paramA", "A"), new SqlParameter("paramB", "B"), new SqlParameter("paramC", "C")).ToList();

誰かが何か考えがありますか?

29
czetsuya

メソッドに各パラメーターを渡す必要があります(つまり、リストを渡すことはできません)

IList<XXXViewModel> XXXList =
     _context.Database.SqlQuery<XXXViewModel>("spXXX @param1, @param2", 
     new SqlParameter("param1", param1Value), 
     new SqlParameter("param2", param2Value)).ToList();
32
Eranga

他の誰かがこれに遭遇した場合...

パラメーターをリストとして作成し、SqlQuery呼び出しで.ToArray()を使用して渡しました。私のために働いた。以下が変更されたコードです...

var parameters = new List<object>(); 
parameters.Add(new SqlParameter("param1", param1Value)); 
parameters.Add(new SqlParameter("param2", param2Value)); 
IList<XXXViewModel> XXXList = 
_context.Database.SqlQuery<XXXViewModel>("spXXX @param1, @param2", parameters.ToArray()).ToList(); 
44
Edyn

この問題の解決策(私の場合は)

 var stuff = db.Database.SqlQuery<SomeEntityType>(query, parms);

ここで、クエリは@Nameなどのパラメーターが挿入された文字列です。parms変数はSQLParametersのリストでした。 SQLは一般的なリストを好まない...

SQLには、汎用型のリストではなく、object []として送信されるSQLParametersの配列が必要です。

var stuff = db.Database.SqlQuery<SomeEntityType>(query, parms.ToArray());
4
John Peters

私の場合、パラメータのSQL typeおよびnull値の処理により、この問題は解決されました。同じ例外を投げていたNo mapping exists from object type System.RuntimeType to a known managed provider native type.これも

var parameter1 = new SqlParameter("parameter1", typeof(string));
var parameter2 = new SqlParameter("parameter2", typeof(string));
var parameter3 = new SqlParameter("parameter3", typeof(string));

parameter1.Value = string.IsNullOrEmpty(parameter1Value) ? (object)DBNull.Value : parameter1Value;
parameter2.Value = string.IsNullOrEmpty(parameter2Value) ? (object)DBNull.Value : parameter2Value;
parameter3.Value = string.IsNullOrEmpty(parameter3Value) ? (object)DBNull.Value : parameter3Value;

http://karim-medany.blogspot.ae/2014/02/no-mapping-exists-from-object-type.html

1
Ali Umair

sQL Serverのバージョンは明記されていませんでしたが、Erland Sommarskogは、SQL Serverと.NETでテーブル値パラメーターを使用する方法に関する記事を公開しています。

http://www.sommarskog.se/arrays-in-sql-2008.html

単一のパラメーターを使用して、クライアントから可変量の引数を渡すことができます。

0
darkstar

ストアドプロシージャが更新/挿入専用の場合は、次のものも使用できます。

string cmd = Constants.StoredProcs.usp_AddRoles.ToString() + " @userId, @roleIdList";
int result = db.Database
                        .ExecuteSqlCommand
                        (
                           cmd,
                           new SqlParameter("@userId", userId),
                           new SqlParameter("@roleIdList", roleId)
                        );
0