gpt4 book ai didi

c# - 为什么我在 Entity Framework 和 SQL Server 事务中得到不同的结果?

转载 作者:太空宇宙 更新时间:2023-11-03 21:07:10 26 4
gpt4 key购买 nike

在我的 EF 代码和 SQL Server 中,我尝试在该用户不存在时插入用户数据,但 EF 插入了 1000 次,在 SQL Server 中仅插入了 1 次。

EF代码:

static void Main(string[] args)
{
using (var db = new MyDbContext())
{
for (var i = 0; i < 1000; i++)
{
var count = db.Users.Count(f => f.Name == "Test");
if (count > 0) continue;

db.Users.Add(new User
{
Name = "Test",
Gender = "Male",
Phone = "1111111111",
CreateTime = DateTime.Now
});
}

try
{
db.SaveChanges();
//1000 rows effected
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}

Console.ReadKey();
}

T-SQL 代码:

declare @i int = 0
begin tran

while(@i < 1000)
begin
if not exists (select 1 from [dbo].[User] where Name = 'Test')
insert into [dbo].[User] values('Test','Male','1111111111',getdate())
set @i = @i + 1
end

if(@@ERROR > 0)
rollback tran
else
commit tran

即使我使用事务包装 EF 代码(但调用一次 SaveChanges),结果也与受影响的 1000 行相同。

但是当我使用这段代码时,结果与 SQL Server 中的结果相同:

using (var db = new MyDbContext())
{
using (var trans = db.Database.BeginTransaction(ReadCommitted))
{
for (var i = 0; i < 1000; i++)
{
var count = db.Users.Count(f => f.Name == "Test");
if (count > 0) continue;

db.Users.Add(new User
{
Name = "Test",
Gender = "Male",
Phone = "1111111111",
CreateTime = DateTime.Now
});

//1 row effected as sql does
db.SaveChanges();
}

try
{
trans.Commit();
}
catch (Exception ex)
{
trans.Rollback();
Console.WriteLine(ex.Message);
}
}
}

请告诉我为什么 EF 和 SQL 之间的事务不同

最佳答案

db.Users.Add 不插入。它在调用 SaveChanges 时进行插入(您认为 SaveChanges 做了什么,或者如果不是为了写出以前不是 写的?)。这就是为什么 db.Users.Count(f => f.Name == "Test") 总是返回零。

这与交易无关。

(顺便说一句,您可能应该在这里使用 Any 而不是 Count)。

关于c# - 为什么我在 Entity Framework 和 SQL Server 事务中得到不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40450686/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com