微风自定义操作

时间:2014-05-26 07:01:55

标签: c# entity-framework breeze

我已经在一些项目中使用过BreezeJS一段时间了,我不得不说,在大多数情况下,它会让你的生活变得更加轻松,这就是为什么我会继续回归它。然而,我似乎一直遇到一个完全平坦的情况,我似乎无法找到任何"正确的"解决这个问题的方法。

让我解释一下。关于BreezeJS的最好的事情之一是它遵循这个UoW模式,允许您使用实体管理器的saveChanges方法保存实体,如EF。

然而,这也是问题的一部分,因为随着您开发越来越复杂的应用程序,我有时觉得这种方法并不总是合适的。我发现我经常这样:

  1. 并非真正涉及在客户端上创建实体的操作,而是涉及在web api上执行可能导致在服务器上创建各种实体或其他形式的状态的操作,然后应该是发回给客户。
  2. 涉及具有属性的实体的操作,这些实体无法保存,因为其中一些属性是服务器专用的,不应该放在客户端上(通常用客户端的JsonIgnore解决,但在开始持久化时会出现问题)再次给定的实体)
  3. 我觉得有一件事可以相对容易地解决这些问题,而且这个概念已经存在于OData:Actions中。可以在全局,实体集或特定实体上执行的操作,然后返回将由BreezeJS直接跟踪的自定义对象或实体。

    目前,我发现自己正在做以下的解决方法(我不知道是否合适):<​​/ p>

    • 制作一个&#34;资源&#34; BreezeController上的动作表示动作而不是实际资源。这会接受一个自定义参数对象并返回一个非实体对象,该对象可能包含实际实体(如&#34; Cool Breezes&#34;描述中所述,因为这些将由BreezeJS跟踪)
    • 使用&#34; ajaxpost&#34; breeze lab允许使用POST而不是GET查询资源,因此可以传入任何类型的参数。

    有没有更合适的方式来完成这样的事情?是否有未来计划支持自定义操作?

    我已经看到解决这种类型的操作的方法是简单地进行这些操作&#34;围绕&#34;微风api控制器。也就是说,简单地使用与微风无关的ApiController。但我觉得这会破坏微风的目的,因为那时,如果操作导致实体的创建或删除,你必须自己在客户端上开始跟踪它们,通过在本地创建它们,或者通过发出另一个微风查询得到他们。如果您需要大量这些类型的操作,这真的很烦人。

2 个答案:

答案 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能够满足自定义操作的需求,这些操作可能会以更直观的方式返回自定义非跟踪对象

希望这有帮助