我有一个使用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
我知道的事:
- 所有属性在服务器上都是pascalcase。
- 服务器上没有设置非默认的格式化程序。
- 当我看到服务器响应时,它是在Pascal中。
- 如果我去掉这个设置,一切工作正常,命名为Pascal。
设置已设置,这意味着当我选中
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大小写,也可以正常工作,但不是首选。