代码之家  ›  专栏  ›  技术社区  ›  Bill at Work

EF6 database first for Oracle有时不为表生成类

  •  1
  • Bill at Work  · 技术社区  · 7 年前

    我正在使用Visual Studio 2013和Entity Framework 6.1.3对旧版Oracle 12c数据库生成数据库第一个EDMX模型。我遇到的问题是,对于某些表,只生成表的存储模型定义,但它应该同时生成存储模型定义和概念模型定义。如果没有概念模型定义,就无法生成C#类,因此我无法使用这些表。

    有关我正在使用的工具的信息:

    • Visual Studio 2013第12.0版
    • .净额4.5.2
    • 实体框架6.1.3
    • Oracle 12c
    • 官方Oracle ODP。NET,托管驱动程序12.1.2400
    • Oracle官方ODP。NET托管实体框架驱动程序v.12.1.2400

    几天来,我一直在想如何解决这个问题。我在web上只找到一个报告的实例,甚至与我的情况非常接近( https://www.codeproject.com/Questions/1102413/EF-doesnt-add-all-tables-in-conceptual-model ),但没有报告该问题的解决方案。

    我正在尝试向其中添加表的EDMX目前包含大约40个表定义。有趣的是,我可以创建一个单独的、空的EDMX文件,并在某些时候成功地添加问题表,但并非总是这样。我曾考虑在单独的EDMX中为我的表生成定义,然后将它们复制到原始的EDMX中,但我不相信我会成功地包含所有必要的标记,尤其是在尝试包含其他表之间的导航链接时。而且,每次遇到有此问题的表时,都必须这样做,这将是非常可怕的。

    EF问题的各种解决方案都说“运行自定义工具”,但由于缺少概念模型信息,这种方法在这种情况下不起作用。

    谢谢你的帮助。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Bill at Work    7 年前

    我终于知道发生了什么事。其中一个“问题”表实际上不是问题,只是我对实体框架如何工作的误解。此表是一个纯联接表,只有两列:一列指向表a,另一列指向表B。实体框架不会为纯联接表生成类。相反,它只是将其转换为两个联接表的类(类A和类B)上的导航链接。

    第二个表的问题是真实的,是由数据库中不匹配的列定义引起的。外键定义的一侧有一列类型编号(18),另一侧有一列类型编号(22)。EF正在将数字(18)转换为长,将数字(22)转换为十进制。EF显然不喜欢在其导航链接的末端有不同的C#类型。

    为了解决这个问题,我修改了EDM编号映射(请参见 https://docs.oracle.com/cd/E56485_01/win.121/e55744/entityDataTypeMapping.htm#BABGBJCI )所以数字(18)和数字(22)都解析为long。然后,我从EF设计器中删除了所有表定义,并重新添加它们,以便重新生成所有字段类型。我想我也可以通过修复数据库中不匹配的类型来解决这个问题,但我在几十个地方发现了同样的问题,所以我选择了代码解决方案。