【问题标题】:why does visual studio delete my classes when I update entity framework model为什么当我更新实体框架模型时,Visual Studio 会删除我的类
【发布时间】:2013-08-08 13:41:59
【问题描述】:

我在更新我的 EF 模型(版本 5)时遇到了一个奇怪的问题。它删除属于该模型的所有类。

我的情况是这样的。我更改了两个表的键列,这些表引用了我的主表。更新模型并没有对 edmx 进行这些更改,因此我删除了这三个表(主表和两个查找表),保存了 edmx。然后更新模型并重新添加这些表。

一旦我在更新模型后保存了模型,VS 就删除了这个 edmx 的所有类文件。所有表格的 edmx 看起来都还不错,只是类已经消失了。然后我必须恢复我上次的更改并重试。

确实有效的一件事是手动编辑 edmx 文件以对受影响的类进行适当的更改,但我不明白为什么我必须这样做。

有什么想法吗?

谢谢!

【问题讨论】:

    标签: c# visual-studio-2012 entity-framework-5


    【解决方案1】:

    在删除然后重新添加表以使 EDMX 获取对外键 (FK) 列的更改后,会发生这种情况。

    这是因为与其他表的关系没有刷新。

    根据这个答案https://stackoverflow.com/a/34144341,要手动修复此问题,按“仅构建”过滤错误列表,然后在 EDMX 编辑器中手动解决任何构建错误。注意关系的多样性。

    或者,使用版本控制恢复整个 EDMX 更改并重新开始,使用以下方法:

    与其仅删除和重新添加包含已更改 FK 列的表,不如删除并重新添加与已更改的任何 FK 列有任何关系的所有表。

    【讨论】:

    • 是的,在我的情况下,一种关系的多重性导致类的重建失败,并导致所有类都从 *.tt 文件中删除。
    【解决方案2】:

    已经很久了,但最后发现我的 edmx 文件中有一些我没有看到的错误,这导致 poco 类文件无法生成。

    【讨论】:

      【解决方案3】:

      同样的事情也发生在我身上。我有一个带有字符串值的表,但我想将其更改为外键,以便可以将重复出现的字符串值存储在单独的表中。所以我创建了一个新表,并将字符串列类型更改为不可为空的 int 并添加了一个外键。当我更新模型时,它会将所有实体类都标记为已删除……不好笑。

      我还看到一些错误弹出,表明 EF 没有将列类型从 string 更改为 int。

      上面提到的解决方案(自定义工具和转换所有模板)对我不起作用。

      对我来说,解决方案是先在模型中手动将列类型从 string 更改为 int,然后再更新模型,不再出现问题。

      郑重声明:这发生在 Visual Studio 2010 的 EF 4 中。

      【讨论】:

      • 这只是在我使用 Visual Studio 2013 和 Entity Framework 版本 6.0.0.0 以及运行时版本 v4.0.30319 时发生的。我刚刚添加了两个存储过程,而没有更改模型。 这个问题过去曾发生在我身上,但我没有注意到导致它的模型发生了变化。我已经使用这项技术2年多了。 @beastieboy,我在运行自定义工具功能下什么也没找到,也没有找到你提到的按钮。
      • 我还添加了外键关系。
      【解决方案4】:

      为了解决这种情况,我将所有表定义文件从模型所在的目录中移出。然后我告诉团队资源管理器恢复删除。它将文件重新添加到我的目录中,我能够继续。

      【讨论】:

      • 我没有使用 tfs,我使用的是颠覆。
      【解决方案5】:

      您可以尝试以下方法之一:

      1) 在 Visual Studio 的解决方案资源管理器中右键单击“.edmx”文件,然后选择菜单项“运行自定义工具”。

      2) 在解决方案资源管理器标题栏下方,您可以看到一个带有工具提示“转换所有模板”的按钮。点击它。它应该在“YourEdmxFileName.tt”文件下更新您的模型。

      3) 在 Visual Studio 的“构建”菜单下,选择“转换所有 T4 模板”。

      4) 找到各个 T4 模板文件 (*.tt),右键单击它们并选择“运行自定义工具”。

      【讨论】:

      • 我最终在“构建”菜单下找到了“转换所有 T4 模板”,但它无法重建我遇到问题的 edmx。最后我只是恢复了我的代码并手动编辑了文件。
      • 有同样的问题.. 非常愚蠢的问题.. 有时当我在将不可为空的内容更改为可空的内容后从数据库刷新时随机发生
      【解决方案6】:

      确保您没有任何命名约定为 _ 的变量。 如果有,EF 将失败并重新编写所有类。

      更改变量名 p_ 对我有帮助。

      【讨论】:

      • 确保您的列名与数据库中的列名大小写相同
      【解决方案7】:

      我也遇到过类似的问题。

      我正在使用 VS2013、EF6,并连接到 ORACLE 11G(数据库优先)。

      我添加了一个表,该表具有另一个表的外键。由于某种原因,这两个表中的外键类型不同。

      更新外键类型解决了我的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多