【问题标题】:How do you build OData IEdmModel from Entity Framework model如何从实体框架模型构建 OData IEdmModel
【发布时间】:2013-11-17 15:56:02
【问题描述】:

标题确实说明了一切。我发现了几个不同方式的博客(将 EF 模型序列化为 XML,然后再次反序列化为 IEdmModel 就是其中之一),但它们都是基于旧版本的 OData 包。

【问题讨论】:

    标签: asp.net-web-api odata asp.net-web-api-odata


    【解决方案1】:

    序列化是唯一的方法。

    几个月前我ranted about this。 AFAIK 从那以后什么都没有改变,我个人不希望他们改变太多。小故事就是as of September 2012,目前没有在EF中使用EdmLib的计划,也没有在其他项目中使用EF的代码。

    我们应该在多大程度上与 OData 的 EdmLib 保持一致?

    Not worth adopting code
        Cost of implementing SSDL & MSL
        Freedom to evolve our API independently 
    Look at aligning names of types and properties where appropriate
    

    【讨论】:

    • 那个例子似乎不起作用。我可以从return 语句中看到它使用Microsoft.Data.Edm.Csdl.EdmxReader.Parse,这显然会产生Microsoft.Data.Edm.IEdmModel,而我们想要IEdmModelOData 命名空间中。
    • @Asad Things 确实有 changed。我在 MSDN 上找不到新的 .OData 命名空间的文档,尽管我认为 here 是实施项目的新官方地点。现在似乎没有参考文档集,但有一个“教程”。相关部分是this one。 API 看起来很相似。
    • 我已经找到了用于解析 edmx 文件的相关新 API,但它阻碍了您从 DbContext 序列化的 edmx。我放弃并降级到 OData v3。
    • @Asad 太糟糕了。从理论上讲,CSDL 模式应该是兼容的,所以如果你有时间,我认为任何一个团队(无论谁弄错了)都会喜欢一个错误报告。
    • @tne 问题在于嵌入式 CSDL 和 CSDL Microsoft.Data.Edm.Csdl.CsdlWriter 写入都是 OData v3。但是Microsoft.OData.Edm.Csdl.CsdlReader 只接受 OData v4。我一直无法找到连接这两者的方法。 EDMX 也是如此。我有一个非常大的数据库模型,我想通过 OData v4 访问它。我已经使用 EF 向导创建了模型,并且可以使用 WCF 数据服务和 OData v3 访问它。你有什么想法我可以尝试使它与 OData v4 一起工作吗?
    【解决方案2】:

    如果您的 DbContext 是从数据库优先的方法构建的,则给定的答案将失败并给出此错误:

    不支持创建 DbModelBuilder 或从使用 Database First 或 Model First 创建的 DbContext 编写 EDMX。 EDMX 只能从不使用现有 DbCompiledModel 创建的 Code First DbContext 中获取。

    经过一段时间的处理,我找到了合适的解决方案。基本上,您从包含相关 DbContext 的程序集中获取 CSDL 资源,并使用 Microsoft.Data.Edm.Csdl.CsdlReader.TryParse 方法对其进行解析。生成的 IEdmModel 是有效的,其中包含构建模型时 EntityFramework 给出的确切信息。

    在这里查看example with usage

    【讨论】:

      猜你喜欢
      • 2010-09-22
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 2012-02-23
      • 1970-01-01
      相关资源
      最近更新 更多