0

我有 SP 验证当前用户是否存在于内部数据库中并返回用户详细信息。如果用户在内部 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,它不会插入现有行,但是如果我使用具有相同参数值的实体框架从我的代码中执行它,它总是会插入新用户,即使它已经在 Db 中。任何想法为什么会发生?

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

4

1 回答 1

0

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

于 2013-11-07T19:30:18.777 回答