gpt4 book ai didi

sql-server - Entity Framework 5 TSQL与SQL 2005调用存储过程不兼容

转载 作者:行者123 更新时间:2023-12-02 21:05:53 24 4
gpt4 key购买 nike

我正在针对 SQL 2005 数据库使用 Entity Framework 5,代码优先。我有一个存储库,其中有一个执行存储过程的方法 - 该方法如下所示;

   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);
}

我尝试过的另一个变体是;

    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 中,但出现错误,因为不支持在一行中声明和分配的语法

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

工作正常!所以我的问题是 Entity Framework 为什么使用这种心理语法?我做了一些谷歌搜索,人们谈论 ProviderManifestToken 但这显然只有在使用完全不同的平台(如 sql ce)时才需要,而不是在 sql 版本之间。那么我是否缺少某个设置,或者我可以更改查询以强制它以不同的方式执行吗?

谢谢大家!

最佳答案

终于开始工作了 - 我尝试按照这篇文章 http://blog.oneunicorn.com/2012/04/21/code-first-building-blocks/ 进行操作(由 Entity Framework 团队的 Arthur Vickers 编写)告诉 DbContext 使用 sql 2005 语法 - 因此,当我构建上下文时,我会这样做;

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;

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'

它在 SQL 2005 中完美运行。但请注意- MiniProfiler(我用它来监视 Entity Framework 调用)错误地将执行的 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 Profiler!

关于sql-server - Entity Framework 5 TSQL与SQL 2005调用存储过程不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15924635/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com