我有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执行的部分和我添加实体的部分都使用不同的上下文。所以我总是有重复。用法单个上下文解决了问题。
答案 0 :(得分:0)
EF调用相同的程序吗?如果是这样,我建议使用SQL server profiler从应用程序捕获命令(假设这是本地或隔离的开发环境)并验证它发送的命令