1

Entity Framework 4.1 を使用して ASP.Net MVC 3 アプリケーションを開発しています。実行する必要がある特定の複雑なクエリについて、未加工の SQL クエリを作成し、それを組み込みのdbSet.SqlQueryメソッドに渡すことにしました。

SQL クエリを query という文字列変数に割り当てる以下のような Service メソッドがあります。クエリには 2 つのパラメーターが渡されるため、SQL インジェクションを防ぐためにこれらをパラメーター化しました。

public IList<User> GetAvailableLocums(int shiftID, int shiftDateID)
{
           var query ="Select .... where t1 = @p0 and t2 = @p1";

           ObjectParameter _shiftID = new ObjectParameter("p0", shiftID);
           ObjectParameter _shiftDateID = new ObjectParameter("p1", shiftDateID);

           object[] parameters = new object[] { _shiftID, _shiftDateID };


           return _UoW.User.GetWithRawSql(query, parameters).ToList();
 }

次に、クエリとパラメーターを、クエリを実行するリポジトリ内のメソッドに渡します。

public IEnumerable<TEntity> GetWithRawSql(string query, params object[] parameters)
{
            return dbSet.SqlQuery(query, parameters).ToList();
}

SQL Server Management Studio でテストしたので、クエリが正しいことはわかっていますが、現在、このコードを実行しようとすると次のエラーが発生します。

オブジェクト型 System.Data.Objects.ObjectParameter から既知のマネージド プロバイダーのネイティブ型へのマッピングは存在しません

これを修正する方法について何か提案はありますか?

ご協力いただきありがとうございます。

4

2 に答える 2

8

人々

問題は、ObjectParameterを使用してパラメーターを作成していたことです。代わりにこれをSqlParameterに変更しましたが、正常に機能しました。下記参照。

これから変更

ObjectParameter _shiftID = new ObjectParameter("p0", shiftID);

これに

SqlParameter _shiftID = new SqlParameter("p0", shiftID);

そしてそれはうまくいった。これが他の誰かに役立つことを願っています。

于 2012-09-13T13:18:17.333 に答える
0

簡単なGoogle検索から、それはあなたの近くのように見えます. SQLクエリの戻り値の型を設定していないと思います:

return dbSet.SqlQuery<TEntity>(query, parameters).ToList();

これは、Entity Framework にマップ方法を伝えるだけです。

于 2012-09-13T11:24:02.837 に答える