我正在使用实体框架 5,代码优先针对 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);
}
我尝试的另一个变体是;
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
工作正常!所以我的问题是实体框架是如何使用这种心理语法的?我已经进行了一些谷歌搜索,人们谈论 ProviderManifestToken 但这显然只有在转到完全不同的平台(如 sql ce)时才需要,而不是在 sql 版本之间。那么是否有我缺少的设置,或者我可以更改查询以强制它以不同的方式执行?
谢谢大家!