edmx mysql 实体注释_实体框架-如何使用数据库更改来更新edmx文件?

实体框架-如何使用数据库更改来更新edmx文件?

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

例如,如果我将字段从非null更改为可为空,或者如果我删除字段,则更新模型不会反映更改。 我必须删除该实体并将其重新添加以使更改显示在模型中。

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

答案之一似乎是一回事,即您需要删除实体并将其重新添加。

这是确定的答案还是有更好的方法呢?

6个解决方案

58 votes

以安全的方式更新EDMX:

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

从我们日常使用EDMX更新(24个月内进行100多次更新)开始,我将建议按照以下顺序更新EDMX。

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

打开EDMX设计器

Ctrl-A全选

删除键可删除设计器中的所有模型

重要信息:如果您正在使用TFS进行源代码控制,请不要保存EDMX!*

现在,右键单击并选择“从数据库更新模型”以再次重新创建整个模型。

重建项目以传播更改

显然,这将丢失您对模型所做的任何手动调整,但如果可能,应避免手动调整。 这使得整个过程可随时重现(这是一件好事)。

重要笔记:

如果在Visual Studio中打开了自动保存功能,则需要快速选择更新(上面的步骤5),以避免自动保存功能保存所有内容。

如果您正在使用TFS进行源代码管理,并且在清空EDMX之后又将其保存,则TFS会将所有生成的文件标记为“已删除”,并且再次更新EDMX可能会导致不在源代码管理中的文件断开连接!

此过程不会更新任何存储过程。 此外,我发现刷新EDMX也不会更新仅更改了返回类型的存储过程(从EF 6.1.1开始仍然是最新的)。

附加建议:

将您的EDMX保存在单独的库中。 这也是添加其他TT文件和部分类的好地方(例如,扩展EDMX模型的功能)。 我还将在数据库中放置数据库上下文的所有扩展方法。 库中还会生成tt文件,从而使它们都很好地包含在其中。

2015年4月更新

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

2015年9月更新

使用最新的VS2013版本5,如果在EDMX更新期间进行保存,我们仍然会遇到问题。 您仍然可以处于等待删除导致更新期间从源代码管理中删除tt文件的状态。 秘诀在于在步骤4和5之间快速更新! :)

Gone Coding answered 2020-07-22T17:58:22Z

36 votes

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

从MSDN库:

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

使用更新模型向导更新数据库时,它将更新.edmx文件中的存储模型,而不是概念模型。 对现有对象的定义进行更改时,仅存储模型会更新; 概念模型未更新。 有关更新模型向导所做的更改的完整说明,请参见上方的“更新模型向导对.edmx文件所做的更改”链接。

以下是一些有关如何更新更新模型向导未更新的对象的选项(基于您的情况,其中列定义已更改):

使用更新模型向导(更新存储模型),使用设计器打开.edmx文件(默认),找到所需的标量属性,然后在“属性”窗口中编辑所需的属性。

使用更新模型向导(以更新存储模型),使用XML编辑器打开.edmx文件,在CSDL(概念模型)部分中找到所需的属性,然后更改所需的属性。 这与选项1基本相同,但是您正在直接编辑XML(在这里查找和替换可能会有用)。

在模型浏览器中,从概念模型的“实体类型”部分删除所需的实体,并从存储模型的“表/视图”部分删除所需的表。 然后使用更新模型向导将其重新添加。

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

timb answered 2020-07-22T17:56:33Z

1 votes

如果我理解您的问题和示例,那么您从数据库步骤执行更新模型并坐在Model.edmx图上之后,便可以突出显示要更改的类中的属性并在其中显示属性 ,并将其Nullable属性更改为Nullable:True。 那至少是做到这一点的一种方法。

我相信这里的想法是,概念模型(不会从非null更改为可为空)实际上可以与基础数据库表有所不同,因此它不会更改该部分,并且差异可能正是您想要的。 我处理此问题的两种方法是按照您提到的方法进行删除和添加,或者更典型地,我如上所述地手动设置属性。

itsmatt answered 2020-07-22T17:58:47Z

1 votes

考虑到我已经向现有表中添加了新列(c1)。 然后,要在现有实体模型中进行更新,请执行以下操作。

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

我将在必要时将属性c1添加到.edmx文件。 例如,我将在每个c0节点下面添加c1节点。

在Visual Studio中重新加载项目。

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

Siddarth Kanted answered 2020-07-22T17:59:25Z

0 votes

首先,双击.edmx文件

其次,右键单击空白区域,然后选择“从数据库更新模型”

第三,选择菜单栏上的刷新选项卡。

最后,选择要刷新的表,然后选择“完成”。

adi sinha answered 2020-07-22T17:59:58Z

0 votes

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

第2步:在图窗口上,右键单击并选择“从数据库更新模型...”(现在它将仅在更新存储中更新,而不在模型中更新)

第三步:右键单击Model.tt文件,然后单击“运行自定义工具”(现在它也会在模型中更新)

而已!

Chandan Y S answered 2020-07-22T18:00:31Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值