如何在更改数据库结构后正确更新实体模型?

entity-framework entity-model

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

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

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

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

提前感谢您的帮助!

一般承认的答案

你正在做正确的更新。但是,在自动生成模型后,您可以自定义它。更新时,EF设计人员希望尝试保留您可能进行的任何自定义。它必须猜测这一点,并不总是正确的。我会尝试解释它是如何猜测的,因为这可能会帮助你。

您的EDMX有三个部分:

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

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

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

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


热门答案

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



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因