如何使用数据库更改来更新edmx文件



我有一个edmx文件,我更改了数据库中的一个表。我知道有一个"从数据库更新模型"向导,但在许多情况下这是无用的。

例如,如果我将字段从非null更改为null,或者如果我删除字段,则更新模型不会反映这些更改。我不得不删除实体并将其添加回中,以使更改显示在我的模型中。

根据以下问题:如何将数据库更改传播到.edmx文件?

其中一个答案似乎说了同样的话,你需要删除实体并将其添加回

这是决定性的答案吗?还是有更好的方法?

安全方式更新EDMX:

正如您所发现的,来自数据库的更新并不总是正确地更改现有属性。

根据我们对EDMX更新的日常使用(24个月内更新100次),我建议按照以下顺序更新EDMX。

删除现有模型,然后更新:

  1. 打开EDMX设计器
  2. Ctrl-A选择全部
  3. Delete键删除设计器中的所有模型
  4. 重要提示:如果您正在使用TFS进行源代码管理,则此时不要保存EDMX*
  5. 现在右键单击并选择"从数据库更新模型"以重新创建整个模型
  6. 重新生成项目以传播更改

这显然会失去你对模型所做的任何手动调整,但如果可能的话,应该避免手动调整。这使得整个过程在任何时候都是可复制的(这是一件好事)。

重要注意事项:

  • 如果您在Visual Studio中启用了自动保存,则需要快速选择更新(上面的步骤5),以避免自动保存保存所有内容
  • 如果您正在使用TFS进行源代码管理,并且在清空EDMX后碰巧保存了它,TFS会将所有生成的文件标记为"已删除",并且再次更新EDMX可能会导致不在源代码管理中的文件断开连接
  • 此过程不会更新任何存储过程。此外,我发现EDMX的刷新也不会更新只更改了返回类型的存储过程(从EF 6.1.1起仍然是当前的)

附加建议:

将EDMX保存在单独的库中。这也成为添加额外TT文件和分部类的好地方(例如,扩展EDMX模型的功能)。我还将数据库上下文的任何扩展方法放在这个库中。migration文件也是在库中生成的,可以很好地将其包含在内。

2015年4月更新

Visual Studio 2013的最新版本4似乎解决了许多TFS问题。我们现在可以看到VisualStudio签出生成的文件,如果它们没有更改,则会还原它们。以上步骤似乎仍然是最安全的方法。

2015年9月更新

使用最新的VS2013 Release 5,如果在EDMX更新期间发生保存,我们仍然会遇到问题。在更新期间,挂起的删除仍可能导致tt文件从源代码管理中被删除。秘诀是在步骤4和5之间快速更新!:)

重要的第一步是准确了解使用更新模型向导时会发生什么。

来自MSDN Library:

ADO.NET实体数据模型设计器(实体设计器)使用更新模型向导根据对数据库所做的更改来更新.edmx文件。作为此过程的一部分,更新模型向导将覆盖存储模型。更新模型向导还会对概念模型和映射进行一些更改,但只有在将对象添加到数据库时才会进行这些更改。例如,将表添加到数据库中时,会将新的实体类型添加到概念模型中;将列添加到表中时,则会将新特性添加到实体类型中。有关对.edmx文件所做更改的详细信息,请参阅更新模型向导对.edmxx文件所做的更改。

使用更新模型向导更新数据库时,它更新了.edmx文件中的存储模型,而不是概念模型。当对现有对象的定义进行更改时,仅更新存储模型;则不更新概念模型。有关更新模型向导所做更改的完整说明,请参阅上面的"更新模型向导对.edmx文件所做的更改"链接。

以下是一些关于如何更新未由更新模型向导更新的对象的选项(基于列定义被更改的场景):

  1. 使用更新模型向导(更新存储模型),使用设计器打开.edmx文件(默认值),找到所需的标量属性,然后在"属性"窗口中编辑所需的属性
  2. 使用更新模型向导(更新存储模型),使用XML编辑器打开.edmx文件,在CSDL(概念模型)部分中找到所需属性,然后更改所需属性。这与选项1基本相同,但您直接编辑XML(查找和替换在这里可能很有用)
  3. 从模型浏览器中,从概念模型的"实体类型"部分删除所需的实体,从存储模型的"表/视图"部分删除需要的表。然后使用更新模型向导将其添加回

最佳选择将取决于给定的场景。例如,如果您只是更改了一列的定义,那么选项1可能是您的最佳选择。如果您更改了单个表中多个列的定义,那么选项3可能是您的最佳选择。如果您更改了跨多个表使用的列(例如主键/外键),那么直接编辑.edmx XML可能是您的最佳选择。

考虑我已经在现有表中添加了一个新列(c1)。然后,为了在我现有的实体模型中更新相同的内容,我将执行以下操作。

我将在记事本++中打开.edmx文件。

如有必要,我会将属性c1添加到.edmx文件中。例如,我会在每个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> 

在Visual studio中重新加载项目。

最后将属性c1添加到模型中。

步骤1:双击.edmx文件。(图表窗口将打开)

第2步:在图表窗口中,右键单击并选择从数据库更新模型(现在它只会在更新存储中更新,而不会在模型中更新)

步骤3:右键单击Model.tt文件,然后单击Run Custom Tool(现在它也将在模型中更新)

就是这样!

如果我理解你的问题和你的例子,一旦你从数据库中完成了更新模型的步骤,并且你坐在model.edmx图上,你就可以突出显示你想要更改的类中的属性,并显示它上的属性,然后将它的Nullable属性更改为Nullable:TTrue。这至少是一种方法。

我相信这里的想法是,概念模型(没有从非null变为null)实际上可能与底层数据库表不同,因此它不会改变这一部分,这种差异可能正是你想要的。我处理这件事的两种方法要么是删除&如您所述添加,或者更典型的情况是,我手动设置我所提到的属性。

  1. 首先,双击.edmx文件
  2. 其次,右键单击空白区域并选择"从数据库更新模型"
  3. 第三,选择菜单栏上的"刷新"选项卡
  4. 最后,选择要刷新的表,然后选择Finish

相关内容

  • 没有找到相关文章

最新更新