我已经在一些项目中使用过BreezeJS一段时间了,我不得不说,在大多数情况下,它会让你的生活变得更加轻松,这就是为什么我会继续回归它。然而,我似乎一直遇到一个完全平坦的情况,我似乎无法找到任何"正确的"解决这个问题的方法。
让我解释一下。关于BreezeJS的最好的事情之一是它遵循这个UoW模式,允许您使用实体管理器的saveChanges方法保存实体,如EF。
然而,这也是问题的一部分,因为随着您开发越来越复杂的应用程序,我有时觉得这种方法并不总是合适的。我发现我经常这样:
我觉得有一件事可以相对容易地解决这些问题,而且这个概念已经存在于OData:Actions中。可以在全局,实体集或特定实体上执行的操作,然后返回将由BreezeJS直接跟踪的自定义对象或实体。
目前,我发现自己正在做以下的解决方法(我不知道是否合适):</ p>
有没有更合适的方式来完成这样的事情?是否有未来计划支持自定义操作?
我已经看到解决这种类型的操作的方法是简单地进行这些操作&#34;围绕&#34;微风api控制器。也就是说,简单地使用与微风无关的ApiController。但我觉得这会破坏微风的目的,因为那时,如果操作导致实体的创建或删除,你必须自己在客户端上开始跟踪它们,通过在本地创建它们,或者通过发出另一个微风查询得到他们。如果您需要大量这些类型的操作,这真的很烦人。
答案 0 :(得分:1)
我自己也在努力解决同样的问题。我有一个使用breeze在SQL数据库中存储交易的应用程序,在交易存储后,另一个用户可以使用该应用程序将交易发送到后端交易系统。我创建了一个OData操作来导入外部交易系统,所以我可以发布/交易(123)/ ImportTrade。当我使用/ $ metadata获取服务的元数据时,它会看到交易实体具有此操作(它在元数据中)。 我希望微风会在元数据中看到这个,并在交易实体上创建一个方法来对我的OData操作发布帖子,但事实并非如此。如果将它添加到breeze(将OData操作作为实体上的方法公开),这将是一个很好的功能。
作为一种解决方法,我自己使用自定义方法扩展了breeze实体,该方法执行post to / trades(???)/ ImportTrade。 如果微风可以为我们处理这件事会很棒!
答案 1 :(得分:0)
你使用ajax帖子的方法是做一些事情的好方法...... 您也可以通过继承与DB无关的BreezeContext来创建自己的上下文,并在那里执行您的操作而不保存entites并仍然将结果作为非跟踪对象或实体返回。
如果你在服务器上创建一个新实体(对于微风并不总是一个好主意,但仍然可以完成),你必须确保breeze仍然会为该实体生成临时密钥。 您可以使用临时密钥生成器或只删除非跟踪对象的主键。 您可以使用该实体类型的元数据来获取它的主键属性,然后使用javascript删除它们:delete obj [prop] 然后将createEntity与没有主键的非跟踪实体一起使用。 然后Breeze将为您和您的所有设置生成主键。
我也希望Breeze能够满足自定义操作的需求,这些操作可能会以更直观的方式返回自定义非跟踪对象
希望这有帮助