使用Entity框架和EXEC命令执行存储过程的结果不同

时间:2013-11-07 16:58:07

标签: sql-server entity-framework

我有SP,用于验证当前用户是否存在于内部Db中并返回用户详细信息。如果内部Db中不存在用户,则从外部Db中提取详细信息并插入内部。

PROCEDURE [common].[FindUser]
@Query VARCHAR(100)
AS
BEGIN
SET NOCOUNT ON;

IF NOT EXISTS ( SELECT DISTINCT * FROM [common].Users 
                WHERE   Name LIKE '%' + @Query + '%'
                        OR DomainName LIKE '%' + @Query + '%'
                        OR Email LIKE '%' + @Query + '%'
              )
BEGIN
    BEGIN TRY
        BEGIN TRANSACTION;
        INSERT dbo.Users ( Company, Division ,EmployeeNumber, Name, DomainName,Email)
                SELECT DISTINCT 
                    CoNo AS Company,
                    DvNo AS Division,
                    EeNo AS EmployeeNumber,
                    dbo.ProperCase(EmployeeName) AS Name,
                    LoginName AS DomainName,
                    Email AS Email 
                FROM AS400ForDummies.dbo.Employees ue
                WHERE 
                    IsDeleted = 0 AND 
                    TerminationDate IS NULL AND

                    (Email LIKE '%' + @Query + '%'
                    OR EmployeeName LIKE '%' + @Query + '%'
                    OR LoginName LIKE '%' + @Query + '%')

        COMMIT TRANSACTION;
    END TRY
    BEGIN CATCH
        ROLLBACK TRANSACTION;
    END CATCH;
 END


SELECT DISTINCT * FROM [common].Users
WHERE   Email LIKE '%' + @Query + '%'
        OR Name LIKE '%' + @Query + '%'
        OR DomainName LIKE '%' + @Query + '%'
END

问题是,如果我使用EXEC命令执行SP,它将不会插入现有行,但如果我将使用具有相同参数值的Entity Framework从我的代码执行它,则它总是会插入新用户,即使它已经在Db了。 任何想法为什么会发生?

UPD 真正的问题是在SP执行后我的应用内部我使用Add方法将结果添加到实体的EntityCollection。根本原因是SP执行的部分和我添加实体的部分都使用不同的上下文。所以我总是有重复。用法单个上下文解决了问题。

1 个答案:

答案 0 :(得分:0)

EF调用相同的程序吗?如果是这样,我建议使用SQL server profiler从应用程序捕获命令(假设这是本地或隔离的开发环境)并验证它发送的命令