Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果事务已提交或未提交,如何返回?_C#_Asp.net Core - Fatal编程技术网

C# 如果事务已提交或未提交,如何返回?

C# 如果事务已提交或未提交,如何返回?,c#,asp.net-core,C#,Asp.net Core,我想检查事务是否已提交并返回值 我已经写了下面的代码,但我不知道如何返回,如果它是成功与否 public Task Insert(List<PortfolioCompanyLinkModel> record, CancellationToken cancellationToken = default(CancellationToken)) { using (var transaction = _context.Database.BeginTransaction())

我想检查事务是否已提交并返回值

我已经写了下面的代码,但我不知道如何返回,如果它是成功与否

public Task Insert(List<PortfolioCompanyLinkModel> record, CancellationToken cancellationToken = default(CancellationToken))
{
    using (var transaction = _context.Database.BeginTransaction())
    {
        try
        {
            foreach (var item in record)
            {
                PortfolioCompanyLink portfolioCompanyLink = new PortfolioCompanyLink();
                portfolioCompanyLink.PortfolioCompanyId = item.PortfolioCompanyId;
                portfolioCompanyLink.URL = item.URL;
                portfolioCompanyLink.LinkId = item.LinkId;
                portfolioCompanyLink.CreatedBy = portfolioCompanyLink.ModifiedBy = _loggedInUser;
                portfolioCompanyLink.CreatedOn = portfolioCompanyLink.ModifiedOn = DateTime.UtcNow;
                _context.PortfolioCompanyLink.AddAsync(portfolioCompanyLink, cancellationToken);
            }
            transaction.Commit();

        }
        catch (Exception ex)
        {
            transaction.Rollback();
        }
    }
    //return _context.PortfolioCompanyLink.AddAsync(record, cancellationToken);
}
公共任务插入(列表记录,CancellationToken CancellationToken=default(CancellationToken)) { 使用(var事务=_context.Database.BeginTransaction()) { 尝试 { foreach(记录中的var项目) { PortfolioCompanyLink PortfolioCompanyLink=新PortfolioCompanyLink(); portfolioCompanyLink.PortfolioCompanyId=item.PortfolioCompanyId; portfolioCompanyLink.URL=item.URL; portfolioCompanyLink.LinkId=item.LinkId; portfolioCompanyLink.CreatedBy=portfolioCompanyLink.ModifiedBy=\u loggedInUser; portfolioCompanyLink.CreatedOn=portfolioCompanyLink.ModifiedOn=DateTime.UtcNow; _context.PortfolioCompanyLink.AddAsync(PortfolioCompanyLink,cancellationToken); } Commit(); } 捕获(例外情况除外) { transaction.Rollback(); } } //返回_context.PortfolioCompanyLink.AddAsync(记录,cancellationToken); }
请帮助我在此处编写返回语句

如果您想返回一个指示“是否成功”的值,您应该将方法的返回类型更改为
Task
,并返回一个
bool

public async Task<bool> Insert(List<PortfolioCompanyLinkModel> record, CancellationToken cancellationToken = default(CancellationToken))
{
    using (var transaction = _context.Database.BeginTransaction())
    {
        try
        {
            foreach (var item in record)
            {
                PortfolioCompanyLink portfolioCompanyLink = new PortfolioCompanyLink();
                portfolioCompanyLink.PortfolioCompanyId = item.PortfolioCompanyId;
                portfolioCompanyLink.URL = item.URL;
                portfolioCompanyLink.LinkId = item.LinkId;
                portfolioCompanyLink.CreatedBy = portfolioCompanyLink.ModifiedBy = _loggedInUser;
                portfolioCompanyLink.CreatedOn = portfolioCompanyLink.ModifiedOn = DateTime.UtcNow;
                await _context.PortfolioCompanyLink.AddAsync(portfolioCompanyLink, cancellationToken);
            }
            transaction.Commit();
            return true;

        }
        catch (Exception ex)
        {
            transaction.Rollback();
            return false;
        }
    }
}
公共异步任务插入(列表记录,CancellationToken CancellationToken=default(CancellationToken)) { 使用(var事务=_context.Database.BeginTransaction()) { 尝试 { foreach(记录中的var项目) { PortfolioCompanyLink PortfolioCompanyLink=新PortfolioCompanyLink(); portfolioCompanyLink.PortfolioCompanyId=item.PortfolioCompanyId; portfolioCompanyLink.URL=item.URL; portfolioCompanyLink.LinkId=item.LinkId; portfolioCompanyLink.CreatedBy=portfolioCompanyLink.ModifiedBy=\u loggedInUser; portfolioCompanyLink.CreatedOn=portfolioCompanyLink.ModifiedOn=DateTime.UtcNow; wait_context.PortfolioCompanyLink.AddAsync(PortfolioCompanyLink,cancellationToken); } Commit(); 返回true; } 捕获(例外情况除外) { transaction.Rollback(); 返回false; } } }
在上面的示例代码中,我还将该方法标记为
async
,并等待
AddAsync
方法。

您可以使用以下方法:

Transaction.Current.TransactionInformation.Status
要获取状态,请执行以下操作:

这是一个枚举。根据MSDN:

中止2
事务已回滚

活动0
事务的状态未知,因为仍必须对某些参与者进行轮询

承诺1
事务已提交

印度支那3

您的代码可以如下所示:

public Task Insert(List<PortfolioCompanyLinkModel> record, CancellationToken cancellationToken = default(CancellationToken))
{
    using (var transaction = _context.Database.BeginTransaction())
    {
        try
        {
            foreach (var item in record)
            {
                PortfolioCompanyLink portfolioCompanyLink = new PortfolioCompanyLink();
                portfolioCompanyLink.PortfolioCompanyId = item.PortfolioCompanyId;
                portfolioCompanyLink.URL = item.URL;
                portfolioCompanyLink.LinkId = item.LinkId;
                portfolioCompanyLink.CreatedBy = portfolioCompanyLink.ModifiedBy = _loggedInUser;
                portfolioCompanyLink.CreatedOn = portfolioCompanyLink.ModifiedOn = DateTime.UtcNow;
                _context.PortfolioCompanyLink.AddAsync(portfolioCompanyLink, cancellationToken);
            }
            transaction.Commit();

        }
        catch (Exception ex)
        {
            transaction.Rollback();
        }

       finally
       {
           var status = transaction.TransactionInformation.Status;
           if (status.Committed)
               return true;

           return false;  
       }
    }


    //return _context.PortfolioCompanyLink.AddAsync(record, cancellationToken);
}
公共任务插入(列表记录,CancellationToken CancellationToken=default(CancellationToken)) { 使用(var事务=_context.Database.BeginTransaction()) { 尝试 { foreach(记录中的var项目) { PortfolioCompanyLink PortfolioCompanyLink=新PortfolioCompanyLink(); portfolioCompanyLink.PortfolioCompanyId=item.PortfolioCompanyId; portfolioCompanyLink.URL=item.URL; portfolioCompanyLink.LinkId=item.LinkId; portfolioCompanyLink.CreatedBy=portfolioCompanyLink.ModifiedBy=\u loggedInUser; portfolioCompanyLink.CreatedOn=portfolioCompanyLink.ModifiedOn=DateTime.UtcNow; _context.PortfolioCompanyLink.AddAsync(PortfolioCompanyLink,cancellationToken); } Commit(); } 捕获(例外情况除外) { transaction.Rollback(); } 最后 { var状态=transaction.TransactionInformation.status; 如果(状态已提交) 返回true; 返回false; } } //返回_context.PortfolioCompanyLink.AddAsync(记录,cancellationToken); }
mm8的回答解释了如果代码成功与否,如何返回true/false。没有理由检查事务的状态,因为调用提交或回滚的是代码本身。即使
Commit
抛出,也会执行
catch
块并再次抛出,因为事务已经回滚

不过,在EF/EF核心中不需要这样的代码。DbContext缓存所有更改,并仅在调用
SaveChanges
时将其保存到数据库中。本教程中的部分介绍:

对于大多数数据库提供程序,SaveChanges是事务性的。这意味着所有操作要么成功,要么失败,并且操作永远不会被部分应用

将多个对象保存到数据库所需的全部工作是:

foreach (var item in record)
{
    PortfolioCompanyLink portfolioCompanyLink = new PortfolioCompanyLink();
    .....
   //In-memory operation only. Doesn't need awaiting. Doesn't change the database
   //This only modifies the in-memory entities tracked by the context
   _context.PortfolioCompanyLink.Add(portfolioCompanyLink);
}
//Writes *all* changes to the database in a single transaction
await _context.SaveChangesAsync(cancellationToken);
不需要显式事务
savechangesync
将回滚所有更改并在出现任何错误时抛出

事实上,尝试按自定义
AddAsync
方法的方式在每个步骤上调用
savechangesync
,将产生意想不到的后果<代码>保存更改同步保存所有更改,而不仅仅是最后一个更改。如果该上下文有待删除的更新,则对
AddAsync
的第一次调用可能会删除或更新记录

显式长时间运行事务的另一个问题是,即使对于小型应用程序,它们也会严重损害可伸缩性。事务不断更新它所接触的行和表,从而阻止其他事务。让事务无故保持活动状态会导致阻塞甚至死锁。

不要