私のEFコードとSQL Serverでは、このユーザーが存在しないのにユーザーデータを挿入しようとしましたが、EFはSQL Serverに1回だけ1000回挿入しました。Entity FrameworkとSQL Serverのトランザクションで異なる結果が生じるのはなぜですか?
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
の間で異なっている
私はefコードでトランザクションを開始しますが、foreachから1回だけsavechangesを実行しても、SQLは1000回挿入されますが、sqlは挿入されません。彼らはトランザクションにあります(コミットしないとsqlにデータが挿入されるのですか?) – Kratos
質問であなたが言ったことを繰り返しただけです。どのように物事を前進させることになっていますか?つまり、あなたが理解していないことを正確に説明してください。 – usr
トランザクションがコミットされていなくても(@iが1000より前)、sqlのデータが見つかる(存在しない)理由 – Kratos