Breeze.js的非事务性SaveChanges

时间:2015-02-25 23:27:40

标签: javascript entity-framework asp.net-web-api transactions breeze

想象一下,您的UI包含一个项目列表,每个项目旁边都有一个复选框。您可以选择多个复选框,然后单击按钮以执行批量操作。希望尽可能多地处理行。因此,如果一行失败,则其他所选行不应回滚。

要使用Breeze执行此操作,发送多个不同的保存更有意义,还是有办法处理此方案的开箱即用?

对不起。我是Breeze的新手,并且一直在浏览文档,示例和API,并且看不到任何明确的迹象表明这是可能的。似乎每次调用SaveChanges都是事务性的。或者是实现此行为所需的命名保存?

提前致谢!

1 个答案:

答案 0 :(得分:1)

在Breeze中没有简单的方法可以进行非事务性批量保存 。您最简单的方法是单独保存每个更改。如果这对你很重要,你可以并行发射并等待所有人完成。

但是,如果您正在进行一些严肃的编程游戏,那么就可以完成。以下是该方法的概要。

如何在Breeze

中编写非事务性批量保存

简单的部分是关闭服务器上的事务。

查看ContextProvider.SaveChanges的第二个参数。它是一个微风TransactionSettings对象。如果你" new"你能得到这个

public TransactionSettings()
{
  this.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
  this.Timeout = TransactionManager.DefaultTimeout;
  this.TransactionType = TransactionType.None;
}

您可以使用您喜欢的任何值更改创建一个,但我会引起对TransactionType.None的注意。

在通话中传递给SaveChanges

    [HttpPost]
    public SaveResult SaveChanges(JObject saveBundle)
    {
        return _contextProvider.SaveChanges(saveBundle, myTransactionSettings);
    }

我认为这会阻止EFContextProvider以事务方式保存。

现在你必须在客户端解决问题。我还没有关闭交易,所以我不熟悉如何捕获错误并将错误传输到客户端。

真正的挑战在于客户。当保存部分失败时,您必须执行某些操作。您必须帮助Breeze EntityManager找出哪些实体成功,哪些实体失败并正确处理它们......或者您的实体缓存将变得不稳定。

您必须使用一些非常棘手的保存处理逻辑编写custom Data Service Adapter。这不容易!

我已经在我的Breeze Labs Abstract Rest Adapter中完成了这项工作,但没有记录并且相当复杂。欢迎您阅读并将其推理应用到您自己实施的网络api"数据服务适配器。如果您有预算,您可以参与IdeaBlade专业服务(Breeze的制造商)