2010-04-06 171 views
15

我已经对表结构进行了一些更改,尤其是SQL Server数据库中表之间的关系。现在我想基于这个新的数据库结构更新我的实体模型。如何在更改数据库结构后正确更新实体模型?

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

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

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

感谢您的帮助!

回答

16

你正在做正确的事情来更新。但是,在自动生成模型后,您可以对其进行自定义。当您更新时,EF设计师想要尝试并保留您可能做出的任何自定义设置。它必须猜测这一点,但并不总是正确的。我会试着解释它是如何猜测的,因为这可能会帮助你。

你EDMX有三个部分:

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

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

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

就你而言,最简单的做法可能是在GUI设计器中选择导航并将其删除。这是假定在关系的任何一方都不存在数据库中导航的ID属性。

+2

谢谢你的好解释!我将手动删除导航属性和成员字段。而且万一我搞砸了模型,我会删除edmx文件并从头开始重新创建模型(因为我没有在模型中进行任何定制)。 – Slauma 2010-04-06 13:07:06

3

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

相关问题