我有 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 执行的部分和我添加实体的部分都使用不同的上下文。所以我总是重复。使用单一上下文解决了问题。