我能够使用WebApiOdata和EntityFramework在服务器端创建一个OData(v3)服务,并在客户端使用Breeze,感谢这个文档。
现在我想使用OData规范的第4版来完成同样的工作,但是出现了问题。Breeze提供的EdmBuilder类依赖于与版本3相关的'Microsoft.Data.Edm'。
在EdmBuilder中,这两行代码会阻止项目构建:
现在我想使用OData规范的第4版来完成同样的工作,但是出现了问题。Breeze提供的EdmBuilder类依赖于与版本3相关的'Microsoft.Data.Edm'。
在EdmBuilder中,这两行代码会阻止项目构建:
using Microsoft.Data.Edm.Csdl;
using Microsoft.Data.Edm.Validation;
这很正常,因为我的项目引用了'Microsoft.OData.Edm'(v4)而不是'Microsoft.Data.Edm'(v3)。
所以我把两个using
语句替换成了这个:
using Microsoft.OData.Edm;
using Microsoft.OData.Edm.Csdl;
using Microsoft.OData.Edm.Validation;
现在项目可以构建,但在运行时会抛出以下异常:
"解析EDMX文档时遇到以下错误: UnexpectedXmlElement:根元素不应为Edmx,而是'Edmx'。:(1, 40)"
这个问题出现在EdmBuilder
类的这个位置:
using (var reader = XmlReader.Create(stream))
{
return EdmxReader.Parse(reader);
}
有没有什么办法解决这个问题?比如说我可以在某个地方下载到一个新的EdmBuilder
类?
P.S.:我正在使用Code First迁移,以及在“WebApiConfig”中配置OData路由的代码:
config.MapODataServiceRoute(
routeName: "ODataRoute",
routePrefix: "OData",
model: EdmBuilder.GetEdm<MyDbContext>(),
batchHandler: new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer));
ODataConventionModelBuilder
可以正常工作。我像这样注册我的OData路由:ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Product>("Products");
config.Routes.MapODataRoute(routeName: "odata",routePrefix: "odata",model: builder.GetEdmModel(),batchHandler: new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer));
现在我不再遇到“406不可接受”的错误!所以,是不是不需要breeze emdbuilder了? - dafriskymonkeyOData.Edm.IEdmModel
而不是Data.Edm.IEdmModel
的EdmBuilder
的任何消息吗? - Asad SaeeduddinODataConventionModelBuilder
只在一些特定情况下起作用,即当您的模型确实符合约定时。 - Asad Saeeduddin