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

标签 c# sql-server entity-framework

在我的 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/

相关文章:

c# - SQL Server批量插入/更新与插入或更新场景中的MERGE

.net - 在运行时修改 Entity Framework 模型

entity-framework - 使用 |DataDirectory| 时出现 "URI formats are not supported"异常在 Entity Framework 连接字符串中

c# - 在 WinForms 中访问 ToolStripMenuItem 子项

c# - Quartz.net Core 中的依赖注入(inject)未找到注册服务

java - 在jsp中捕获SQL Raiserror

sql-server - 是否可以在 sqlkata 中查询参数化表值函数?

c# - 为什么即使我的类型实现了 IDisposable,Using 语句也会出错?

c# - Excel 互操作库无法在 Azure 上运行

c# - 如何让我的应用程序运行得更快