2016-11-06 4 views
1

私のEFコードとSQ​​L 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

の間で異なっている

答えて

4

db.Users.Addを挿入しない理由を教えてください。 SaveChangesが呼び出されたときに挿入されます(SaveChangesとは何か考えましたか?以前はではなくと書かれた変更を書き出すために必要でない場合はなぜですか?)そのため、db.Users.Count(f => f.Name == "Test")は常にゼロを返します。

これはトランザクションとは関係ありません。

(Btw、ここではCountの代わりにAnyを使用する必要があります)。

+0

私はefコードでトランザクションを開始しますが、foreachから1回だけsavechangesを実行しても、SQLは1000回挿入されますが、sqlは挿入されません。彼らはトランザクションにあります(コミットしないとsqlにデータが挿入されるのですか?) – Kratos

+0

質問であなたが言ったことを繰り返しただけです。どのように物事を前進させることになっていますか?つまり、あなたが理解していないことを正確に説明してください。 – usr

+0

トランザクションがコミットされていなくても(@iが1000より前)、sqlのデータが見つかる(存在しない)理由 – Kratos

関連する問題