将Breeze js的命名约定设置为“camelcase”;在获取元数据时导致错误



我有一个使用breeze js构建的Web应用程序,与实体框架之上的breeze api控制器进行通信。

我想用camelCase显示属性名和导航属性。在服务器端它们是PascalCase。

按照这里的说明,我在我的代码中添加了以下内容:

 breeze.NamingConvention.camelCase.setAsDefault();

作为结果,我现在得到一个错误,当微风试图获得元数据

 Error: Metadata import failed for Breeze/ZenAPI/Metadata; Unable to process
 returned metadata:NamingConvention for this server property name does not roundtrip properly:houseId-->HouseId

我知道的事:

  1. 所有属性在服务器上都是pascalcase。
  2. 服务器上没有设置非默认的格式化程序。
  3. 当我看到服务器响应时,它是在Pascal中。
  4. 如果我去掉这个设置,一切工作正常,命名为Pascal。
  5. 设置已设置,这意味着当我选中

    breeze.NamingConvention.defaultInstance.name;

我得到"camelCase";

这个问题的原因可能是什么?

NamingConvention。camelCase用于在客户端将pascalcase类型的服务器属性名称转换为camelCase类型的名称。根据错误消息,您正在尝试做相反的事情,即在您的情况下'houseId'是服务器属性名称。

在处理元数据时,breeze尝试通过NamingConvention传递每个属性名来验证它是否可以被绕过。clientPropertyNameToServer方法,然后通过NamingConvention。serverPropertyNameToClient方法或相反,这取决于元数据中是否提供了客户端名称或服务器名称。您收到的消息表明

ServerName   ClientName   ServerName   
----------   ----------   ---------  
'houseId' -> 'houseId' -> 'HouseId'   ( 'houseId' != 'HouseId');

请注意,如果'HouseId'是服务器名,那么这就可以正常工作。

ServerName   ClientName   ServerName   
----------   ----------   ---------  
'HouseId' -> 'houseId' -> 'HouseId'   ( 'HouseId' == 'HouseId');

如果您确实想要'houseId'作为服务器名和客户端名,那么您将需要编写自己的NamingConvention(这实际上非常简单)。见http://www.breezejs.com/sites/all/apidocs/classes/NamingConvention.html

我发现在EF6+上使用实体框架Powertools的Code第一代模型不允许选择数据库对象,因此表"sysdiagrams"都是小写的,而不是我通常用于db对象的Pascal Case表示法。一旦我从模型和上下文类中删除了这个表,那么这个错误就消失了。所有的好。我还测试了breeze.NamingConvention.none.setAsDefault(),并在我的javascript中使用Pascal大小写,也可以正常工作,但不是首选。

最新更新