16

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

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

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

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

提前感谢您的帮助!

4

2 回答 2

16

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

您的 EDMX 包含三个部分:

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

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

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

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

于 2010-04-06T12:49:32.303 回答
3

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

于 2014-12-10T11:17:18.210 回答