我有一个.edmx文件,我更改了我的数据库中的一张表。我知道有“从数据库更新模型”的向导,但在许多情况下这是无用的。
例如,如果我将字段从非空更改为可空,或者如果我删除字段,则更新模型不会反映更改。我必须删除实体并将其添加回来才能让更改出现在我的模型中。
根据以下问题:如何将数据库更改传播到我的.edmx文件?
其中一个答案似乎也是这样说的,你需要删除实体并将其添加回来。
这是最终答案还是有更好的方法可以做到这一点?
我有一个.edmx文件,我更改了我的数据库中的一张表。我知道有“从数据库更新模型”的向导,但在许多情况下这是无用的。
例如,如果我将字段从非空更改为可空,或者如果我删除字段,则更新模型不会反映更改。我必须删除实体并将其添加回来才能让更改出现在我的模型中。
根据以下问题:如何将数据库更改传播到我的.edmx文件?
其中一个答案似乎也是这样说的,你需要删除实体并将其添加回来。
这是最终答案还是有更好的方法可以做到这一点?
正如您所发现的,从数据库更新不总是正确更改现有属性。
根据我们在日常使用中对EDMX更新(24个月内进行了数百次更新)的经验,我建议按照以下顺序更新EDMX。
这显然会丢失您对模型所做的任何手动调整,但应尽可能避免手动调整。这使整个过程可以在任何时间重现(这是一件好事)。
将您的EDMX保留在一个单独的库中。这也成为添加附加TT文件和部分类(例如,扩展EDMX模型的功能)的绝佳位置。我还将数据库上下文的所有扩展方法放在此库中。 迁移文件也在库中生成,使其整洁有序。
最新的Visual Studio 2013 Release 4似乎解决了许多TFS问题。我们现在可以看到Visual Studio检出生成的文件,然后如果它们未更改,则撤消操作。上述步骤仍然是最安全的方法。
使用最新的VS2013 Release 5,在EDMX更新期间发生保存仍会出现问题。您仍可能处于待删除状态,在更新期间从源代码控制中删除tt
文件。秘诀是在步骤4和5之间快速更新! :)
newid()
应仅适用于新插入的记录,因此我不确定StoreGeneratedPattern = Identity
实际上会有什么区别。也许您可以澄清一下? - iCollect.it Ltdedmx
文件(最好是整个数据层)上执行 撤消待处理更改
。然后我获取了最新版本。发生的事情是我的 tt
文件现在回到了 SC 中。然后按照上面提到的步骤进行操作。希望有所帮助。 - Annie Lagang当您使用更新模型向导更新数据库时,它会更新.edmx文件中的存储模型而不是概念模型。对于已有对象定义的更改,只会更新存储模型而不会更新概念模型。有关更新模型向导所做更改的完整说明,请参见上面的“通过更新模型向导修改.edmx文件所做的更改”链接。ADO.NET实体数据模型设计器(实体设计器)使用更新模型向导将.edmx文件从对数据库所做的更改中进行更新。更新模型向导作为这个过程的一部分覆盖存储模型。当向数据库添加对象时,更新模型向导还会对概念模型和映射进行一些更改,但只有在向数据库添加对象时才会进行这些更改。例如,将表添加到数据库时,新实体类型将添加到概念模型中,并且将列添加到表时,实体类型将添加新属性。有关更新模型向导对.edmx文件进行的更改的详细信息,请参见Changes Made to an .edmx File by the Update Model Wizard。
最佳方案取决于给定的情况。例如,如果您只更改了一个列的定义,则选项1可能是最佳选择。如果您更改了单个表中多个列的定义,则选项3可能是最佳选择。如果您更改了在多个表中使用的列(例如主键/外键),则直接编辑.edmx XML可能是最佳选择。
步骤1: 双击.edmx文件。(图表窗口将打开)
步骤2: 在图表窗口上,右键单击并选择从数据库更新模型... (现在它只会在更新存储中更新,而不是在模型中)
步骤3: 右键单击Model.tt文件并点击运行自定义工具 (现在它也会在模型中进行更新)
就这样!
假设我已经在现有的表格中添加了一个新列(c1)。然后为了更新现有的实体模型,我会执行以下操作:
我会使用notepad ++打开.edmx文件。
我会在.edmx文件中添加c1属性,在每个c0节点下面加入c1节点。
<EntityType Name="table">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
<Property Name="c0" Type="nvarchar(max)" />
<Property Name="c1" Type="nvarchar(max)" />
</EntityType>
如果我理解你的问题和示例,一旦你完成了从数据库更新模型的步骤并且你正在Model.edmx图表上,你可以突出显示你想要更改的类中的属性,并显示其属性,将其Nullable属性更改为Nullable: True。这至少是一种方法。
我认为这里的想法是概念模型(从非空到可空不会被更改)实际上可能与底层数据库表不同,因此它不会更改该部分,而这种差异可能正是你想要的。我处理这个问题的两种方式是要么像你提到的那样进行删除和添加,要么更通常地手动设置我提到的属性。