C# 连接到SQL Server进行事务处理的正确方法是什么

C# 连接到SQL Server进行事务处理的正确方法是什么,c#,sql-server,asp.net-mvc,entity-framework,C#,Sql Server,Asp.net Mvc,Entity Framework,哪种方式删除实体更正确 正确的方法:对于很多行,我们应该使用更可信的方式,并在工作结束后关闭事务 第一次尝试: public class UserRepository : IDisposable { private DomainModels.BotEntities _dbDnt = null; public UserRepository() { _dbDnt = new DomainModels.IraniBotEntities(); }

哪种方式删除实体更正确

正确的方法:对于很多行,我们应该使用更可信的方式,并在工作结束后关闭事务

第一次尝试:

public class UserRepository : IDisposable
{
    private DomainModels.BotEntities _dbDnt = null;

    public UserRepository()
    {
        _dbDnt = new DomainModels.IraniBotEntities();
    }

    public bool Delete(int id, bool autoSave = true)
    {
        try
        {
            var entity = _dbDnt.Users.Find(id);
            _dbDnt.Entry(entity).State = EntityState.Deleted;

            if (autoSave)
                return Convert.ToBoolean(_dbDnt.SaveChanges());
            else
                return false;
        }
        catch
        {
            return false;
        }
    }

    public int Save()
    {
        try
        {
            return _dbDnt.SaveChanges();
        }
        catch
        {
            return -1;
        }
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (this._dbDnt != null)
            {
                this._dbDnt.Dispose();
                this._dbDnt = null;
            }
        }
    }

    ~UserRepository()
    {
        Dispose(false);
    }
}
        using (var dbContext = new IraniBotEntities())
        {
            dbContext.Users.Remove(user);
            dbContext.SaveChanges();
        }
然后像这样使用:

   UserRepository repA = new UserRepository();
   repA.Delete(user);
第二次尝试:

public class UserRepository : IDisposable
{
    private DomainModels.BotEntities _dbDnt = null;

    public UserRepository()
    {
        _dbDnt = new DomainModels.IraniBotEntities();
    }

    public bool Delete(int id, bool autoSave = true)
    {
        try
        {
            var entity = _dbDnt.Users.Find(id);
            _dbDnt.Entry(entity).State = EntityState.Deleted;

            if (autoSave)
                return Convert.ToBoolean(_dbDnt.SaveChanges());
            else
                return false;
        }
        catch
        {
            return false;
        }
    }

    public int Save()
    {
        try
        {
            return _dbDnt.SaveChanges();
        }
        catch
        {
            return -1;
        }
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (this._dbDnt != null)
            {
                this._dbDnt.Dispose();
                this._dbDnt = null;
            }
        }
    }

    ~UserRepository()
    {
        Dispose(false);
    }
}
        using (var dbContext = new IraniBotEntities())
        {
            dbContext.Users.Remove(user);
            dbContext.SaveChanges();
        }

哪种方式更正确?因为我在第一种方式中使用了hangfire,服务器上的cpu将达到100%

您应该选择第二种方式而不是第一种方式

要删除多行,可以按如下所述操作

using (var dbContext = new IraniBotEntities())
 {
     var allRec= dbContext.Users;
     dbContext.Users.RemoveRange(allRec);
     dbContext.SaveChanges();
 }

第二您应该总是在完成单个工作单元后立即处理DB资源。尽管如此,这可能不是为什么你的CPU“达到100%”的原因。那么我该怎么办呢?这两种方法都不应该导致你的CPU达到那么高。这里还有别的问题。您发布的任何一种方法都可以。您需要分析您的应用程序以发现发生了什么。第一种方法的优点是,在调用SaveChanges之前可以执行多个操作,因此可以跨多个语句执行单个事务。所以不要听那些说第二种方法永远是最好的。