【问题标题】:How to update correctly an Entity Model after changes of database structure?更改数据库结构后如何正确更新实体模型?
【发布时间】:2010-04-06 12:28:28
【问题描述】:

我对表结构进行了一些更改,尤其是我的 SQL Server 数据库中表之间的关系。现在我想根据这个新的数据库结构更新我的实体模型。

右键单击 edmx 文件,我找到“从数据库更新模型”选项。但是当我这样做时,我得到了 50% 的更新:新列出现在实体类中,但我对模型中仍然存在的许多导航属性感到困惑,尽管相应的外键关系不再存在数据库。 (编辑:虽然数据库中的列已被删除,但模型类中的成员也不会被删除。)

我做错了吗?或者是否有其他选项来更新模型,包括删除导航属性?还是我必须在模型文件中手动删除这些导航属性?

我正在使用实体框架版本 1 (VS 2008 SP1)。

提前感谢您的帮助!

【问题讨论】:

    标签: entity-framework entity-model


    【解决方案1】:

    您正在做正确的更新。但是,在您自动生成模型后,您可以对其进行自定义。当您更新时,EF 设计者想要尝试并保留您可能进行的任何自定义。它必须对此进行猜测,而且并不总是正确的。我将尝试解释它是如何猜测的,因为这可能会对您有所帮助。

    您的 EDMX 包含三个部分:

    • 客户端架构 (CSDL)
    • 存储架构 (SSDL)
    • 客户端和商店之间的映射 (MSL)

    设计者“拥有”商店架构。每次更新时,它几乎都会从头开始重新生成。尽管可以通过手动编辑 SSDL 来自定义存储架构,但更新模型时通常会丢失这些更改。

    另一方面,您“拥有”客户端架构。设计器将在第一次运行时为您生成客户端模式,并将为新导入的数据库元数据对象(例如新映射的表或列)生成客户端模式。但是一旦为一个对象生成了客户端模式,它通常不会被重新生成,因为设计者试图保留您的自定义。因此,如果您以影响客户端模式的方式更改数据库,则必须手动更新客户端模式。您可以在 GUI 设计器中执行此操作,也可以在 XML 中手动执行此操作。

    在您的情况下,最简单的做法可能是在 GUI 设计器中选择导航并将其删除。这是假设在关系的任一侧,数据库中的导航不再有 ID 属性。

    【讨论】:

    • 感谢您的精彩解释!我将手动删除导航属性和成员字段。如果我把模型弄乱了,我会删除 edmx 文件并从头开始重新创建模型(因为我没有在模型中进行任何自定义)。
    【解决方案2】:

    如果您正在使用尚未自定义的实体模型,并且您只需将更改从 SQL 数据库获取到您的 VS 项目中,我发现删除实体模型并从同一源重新生成它是最简单的方法。这样,EDMX 的所有三个部分都将反映数据库中的内容。我之前使用过“从数据库更新模型”选项,然后编辑了 XML/设计器,发现在处理大型数据库时它是一项乏味且耗时的工作。不要误会我的意思,它 100% 有效,但是通过重新创建模型来保持模型的新鲜度要快得多。即使您之后必须编辑一些 LINQ-to-SQL 查询,我发现编辑 LINQ-to-SQL 查询比编辑 EDMX 模型更好。也就是说,我还没有这样做。重要提示:确保您使用与以前相同的设置重新创建模型,例如,如果您创建它之前没有复数对象名称,请执行相同操作。

    【讨论】:

      猜你喜欢
      • 2015-09-21
      • 1970-01-01
      • 2011-03-10
      • 2015-01-19
      • 1970-01-01
      • 2011-06-10
      • 2011-02-26
      • 1970-01-01
      • 2013-06-06
      相关资源
      最近更新 更多