6

SQL 2005データベースに対してEntity Framework 5、Codeを使用しています。私は、ストアドプロシージャを実行するメソッドを持つリポジトリを持っています。このメソッドは次のようになります。エンティティフレームワーク5 TSQLがSQL 2005呼び出しストアドプロシージャと互換性がありません

public IEnumerable<PossibleDuplicateCustomer> GetPossibleDuplicates(Customer customer) 
    { 

     return DbContext.Database.SqlQuery<PossibleDuplicateCustomer>(
      "EXEC SearchPotentialDuplicates @CustomerId = {0}, @FirstName = {1}, @LastName = {2}, @dob = {3}", 
      customer.CustomerId, 
      customer.CustomerFirstName, 
      customer.CustomerLastName, 
      customer.Dob); 
    } 

私が試したもう1つの変種は、

public IEnumerable<PossibleDuplicateCustomer> GetPossibleDuplicates(Customer customer) 
    { 
     return DbContext.Database.SqlQuery<PossibleDuplicateCustomer>(
      "SearchPotentialDuplicates @CustomerId, @FirstName, @LastName, @dob", 
      new SqlParameter("CustomerId", customer.CustomerId), 
      new SqlParameter("FirstName", customer.CustomerFirstName), 
      new SqlParameter("LastName", customer.CustomerLastName), 
      new SqlParameter("dob", customer.Dob)); 
    } 

これを実行するとエラーが発生します。

System.Data.SqlClient.SqlException(0x80131904): 'SearchPotentialDuplicates'の近くの構文が正しくありません。

私はminiprofilerを使用して生成されたSQLを取得しました。

DECLARE @p0 int = 12644, 
    @p1 nvarchar(4) = N'adam', 
    @p2 nvarchar(3) = N'ant', 
    @p3 datetime = '1951-11-01T00:00:00' 

EXEC SearchPotentialDuplicates @CustomerId = @p0, @FirstName = @p1, @LastName = @p2, @dob = @p3 

私がコピーしようとしたとSSMSにこれを貼り付け、それが1行で宣言して割り当てるの構文は

Msg 139, Level 15, State 1, Line 0 
Cannot assign a default value to a local variable. 
Msg 137, Level 15, State 2, Line 6 
Must declare the scalar variable "@p0". 

がサポートされていないので、これは新しいSQL 2008のもの(http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/12/05/sql-server-2008-t-sql-declare-and-set-in-the-same-statement.aspx)でエラーが発生しましたSQL 2005ではサポートされていません。

DECLARE @CustomerId int , 
    @FirstName nvarchar(25), 
    @LastName nvarchar(25) , 
    @dob datetime 

SET @CustomerId = 12645 
SET @FirstName = N'adam' 
SET @LastName = N'ant' 
SET @dob = '1951-11-01T00:00:00' 

exec SearchPotentialDuplicates @CustomerId, @FirstName, @LastName, @dob 

が問題ありません。だから私の質問は、エンティティのフレームワークは、この精神的な構文を使用して来る方法です?私はいくつかのグーグル・グーグルを行い、人々はProviderManifestTokenについて話しましたが、これは明らかにSQLバージョン間ではなく、SQL CEのような全く異なるプラットフォームに行く場合にのみ必要です。だから私は行方不明の設定ですか、私は別の方法で実行するようにクエリを変更することはできますか?

ありがとうございます!

+0

おそらく、旧式の変数宣言を使用してSQL Server 2005のサポートを提供していた可能性がありますが、私はそれを「精神的な構文」と呼んでいません。私はSQL Server 2008よりも古いものをターゲットにしていなければ、T-SQLで変数を宣言することが誰にとっても好意的な方法であるべきだと思います。 –

+1

haha​​はい、間違ってはいけません - それは間違いなくきれいな構文です私は宣言/割り当てを2行に分けなければならないといつも盗んだ!しかし、ターゲットプラットフォームがそれをサポートしている場合は、より良いことです! – Shawson

+1

ADO.NetとSqlCommandはどうですか?このアプローチを使用して、格納されたprocsを呼び出すためのラッパーを作成できます。私はそれが古い方法であり、あなたの質問に答えないと知っていますが、あなたの問題を解決することができます。 –

答えて

2

は、最後に私はこれを行うコンテキストを構築するときにSQL 2005 syntax-を使用するDbContextを伝えるために、私は(エンティティフレームワークチームのアーサー・ビッカースによって)この記事http://blog.oneunicorn.com/2012/04/21/code-first-building-blocks/次試してみたこのworking-を得ました。

var builder = new DbModelBuilder(); 
builder.Entity<PossibleDuplicateCustomer>(); 
var model = builder.Build(new DbProviderInfo("System.Data.SqlClient", "2005")); 
_compiledSql2005Model = model.Compile(); 

// OverdriveDbContext : DbContext 
var context = new OverdriveDbContext(
    nameOrConnectionString: "OverdriveConnectionString", 
    model: _compiledSql2005Model); 

これで、次のSQLが実行されます。

かかわらSQL 2005 に完全に注意の言葉を作品
exec sp_executesql N'EXEC SearchPotentialDuplicates @CustomerId, @FirstName, @LastName, @dob',N'@CustomerId int,@FirstName nvarchar(4),@LastName nvarchar(3),@dob datetime',@CustomerId=12645,@FirstName=N'adam',@LastName=N'ant',@dob='1951-11-01 00:00:00' 

- (私は、エンティティフレームワークの呼び出しを監視するために使用しています)MiniProfilerが誤って実行されたSQLを示しています。

DECLARE @CustomerId int = 12645, 
    @FirstName nvarchar(4) = N'adam', 
    @LastName nvarchar(3) = N'ant', 
    @dob datetime = '1951-11-01T00:00:00' 

EXEC SearchPotentialDuplicates @CustomerId, @FirstName, @LastName, @dob 

私は数時間にわたってこれを修正したことに気づいた!ですから、MiniProfilerのSQLモニタリングは古いSQLプロファイラの代用品ではありません!

関連する問題