在我的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
这里)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句