想象一下,您的UI包含一个项目列表,每个项目旁边都有一个复选框。您可以选择多个复选框,然后单击按钮以执行批量操作。希望尽可能多地处理行。因此,如果一行失败,则其他所选行不应回滚。
要使用Breeze执行此操作,发送多个不同的保存更有意义,还是有办法处理此方案的开箱即用?
对不起。我是Breeze的新手,并且一直在浏览文档,示例和API,并且看不到任何明确的迹象表明这是可能的。似乎每次调用SaveChanges都是事务性的。或者是实现此行为所需的命名保存?
提前致谢!
答案 0 :(得分:1)
在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的制造商)