将新列添加到实体框架中的现有表

时间:2016-03-11 22:06:08

标签: entity-framework ef-database-first database-first

我在数据库的表中添加了一个新列。该表已在现有的Entity Framework模型中定义。我已经完成了大部分关于如何做到这一点的项目,但它仍然失败了。

有一点背景,这个实体模型至少在3年内没有更新过。所以除了我要添加的列之外,我知道在那段时间里已经添加了许多其他列,但从未包括在内。我大约9个月前接手了这个项目,但从未能成功更新模型。

首次尝试:

  • 在Visual Studio中打开模型
  • 右键单击背景
  • 点击“从数据库更新模型...”
  • 点击“刷新标签”
  • 选定的表格
  • 突出显示特定表格
  • 点击完成

结果:

  • 我的模型中的数十个表的类已被删除
  • 相关表格未更新

第二次尝试

  • 恢复所有来源
  • 同上,但
  • 打开更新向导后,单击“删除选项卡”
  • 选定的表格
  • 点击完成
  • 删除了所有表格
  • 已保存EF模型/已关闭/已打开
  • 返回更新向导添加标签
  • 点击表
  • 当我扩展所有内容时,我的表格都没有显示
  • 选中表级别的复选框

结果

  • 我的桌子都没有被添加回来,但任何不是 最初包含已添加

第三次尝试

  • 恢复所有来源
  • 删除了两个.tt文件
  • 打开更新向导
  • 点击Add for Everything

结果

  • 没有重新创建,没有.tt文件或其他任何内容。

第四次尝试

  • 恢复来源
  • 从EF模型中删除了表格
  • 打开更新向导
  • 点击添加表格

结果

  • 我的模型中的数十个表的类已被删除
  • 相关表格未添加回来

最终尝试

  • 手动将实体添加到模型

结果

  • 代码全部编译并运行,但从未从数据库中检索或更新

任何可以提供的帮助或方向都会非常受欢迎,因为我处于关键时刻并且必须更新模型。

8 个答案:

答案 0 :(得分:19)

数据库"更新模型"使用困难/慢,容易出错。它会生成您可能不想要/不需要的其他内容。因此,手动添加所需的列将更好地工作。 我建议你在VS编辑器之外做,因为根据有多少型号/表,在VS中打开文件可能会非常慢。

 1. So in Windows Exlorer,right click on the *.edmx file and open with Notepad (or Notepad++/Textpad).

 2. Search for the text <EntityType Name="YourTableNameToAddColumn">.

 3. Add the property <Property Name="YourNewColumnName" Type="varchar" MaxLength="64" />

 4. Search for the text <MappingFragment StoreEntitySet="YourTableNameToAddColumn">

 5. Add mapping to the new column <ScalarProperty Name="YourNewColumnName" ColumnName="YourNewColumnName"/>

 6. Save the *.edmx file

答案 1 :(得分:7)

上面的alltej答案的附录,并回答了Chris Walsh的回复,他说'他在元数据工作空间中不存在'概念方成员或属性'xxxxx'作为此MSL的一部分。“在新的Scalar属性行上在'

您必须确保在.edmx文件中的 TWO 位置搜索“添加属性”,否则您将收到Chris的错误

答案 2 :(得分:1)

找出问题所在。当我生成模型时,我收到错误113:多重性在角色中无效。我没有注意到它在创建失败时生成的其他16307错误中。一旦我确定一切正常。

由于

答案 3 :(得分:1)

1。因此,在Windows Exlorer中,右键单击* .edmx文件,然后使用记事本(或Notepad ++ / Textpad)打开。

2。搜索文本<EntityType Name="YourTableNameToAddColumn">

3。添加属性<Property Name="YourNewColumnName" Type="varchar" MaxLength="64" />

4。再次搜索文本<EntityType Name="YourTableNameToAddColumn">,还有第二个文本。

5。向其中添加属性<Property Name="YourNewColumnName" Type="varchar" MaxLength="64" />

6。搜索文本<MappingFragment StoreEntitySet="YourTableNameToAddColumn">

7。将映射添加到新列<ScalarProperty Name="YourNewColumnName" ColumnName="YourNewColumnName"/>

8。保存* .edmx文件

9。之后,更新表public string YourNewColumnName { get; set; }的edmx模型

答案 4 :(得分:0)

警告:如果您无法删除数据库,请勿执行以下步骤!

我正在使用Visual Code(.net 2)。 以下是我解决它的方法:

首先,删除您的数据库:

dotnet ef database drop

然后,删除所有迁移:

dotnet ef migrations remove

运行相同的命令,直到所有迁移都被删除!

添加您的第一次迁移:

dotnet ef migrations add InitialCreate

运行上面列出的命令后,请确保在生成的新文件中进行更改,可能是在 Data / Migrations 文件中: timestamp + InitialCreate not not not设计文件

图片示例: Adding new Column

添加匹配后,一切都一致,保存项目并运行以下命令:

dotnet ef database update

如果一切正常,将会创建新列。

答案 5 :(得分:0)

当我向表中添加了一些列,并且我的edmx文件可以很好更新时,我才发现了这个问题。但是,代码生成未正确触发,因此我的.cs文件未更新。我右键单击Entities.tt文件,然后选择“运行自定义工具”,该工具运行文本转换,从而为我修复了该问题。

答案 6 :(得分:0)

我前一段时间遇到了这个问题,能够通过从模型中删除特定表,然后执行“从数据库更新模型”步骤,选择该表来解决该问题。

答案 7 :(得分:0)

确保您的“Model.edmx”文件的名称与“Model.tt”相同,否则只需将其重命名为与 *.tt 文件相同的名称。然后从设计器中删除实体并通过“从数据库更新模型”重新导入。

enter image description here