dtc*_*dtc 44 entity-framework edmx edmx-designer
我有一个edmx文件,我在数据库中更改了一个表.我知道有一个"从数据库更新模型"向导,但在许多情况下这是没用的.
例如,如果我将字段从非null更改为可空,或者如果我删除字段,则更新模型不会反映更改.我不得不删除该实体并将其重新添加以使更改显示在我的模型中.
根据以下问题: 如何将数据库更改传播到我的.edmx文件?
其中一个答案似乎是说同样的事情,你需要删除实体并将其重新添加.
这是确定的答案还是有更好的方法来做到这一点?
Gon*_*ing 58
如您所见,来自数据库的更新并不总是正确地更改现有属性.
从我们日常使用的EDMX更新(超过24个月的100次更新),我建议使用以下序列来更新EDMX.
这显然会丢失您对模型所做的任何手动调整,但如果可能,应避免手动调整.这使得整个过程可以随时重现(这是一件好事).
将您的EDMX保存在一个单独的库中.这也成为添加其他TT文件和部分类的好地方(例如,扩展EDMX模型的功能).我还在此库中放置了数据库上下文的任何扩展方法.这些migration文件也在库中生成,并且保存完好.
Visual Studio 2013的最新版本4似乎解决了许多TFS问题.我们现在看到Visual Studio结帐生成的文件,如果它们没有改变则还原它们.上述步骤似乎仍然是最安全的方法.
使用最新的VS2013第5版,如果在EDMX更新期间发生保存,我们仍然会遇到问题.您仍然可以处于挂起删除导致在更新期间从源控件中删除tt文件的状态.秘诀是在第4步和第5步之间快速更新!:)
小智 37
重要的第一步是准确了解使用更新模型向导时会发生什么.
从MSDN库:
ADO.NET实体数据模型设计器(实体设计器)使用"更新模型向导"从对数据库所做的更改中更新.edmx文件.更新模型向导将覆盖存储模型,作为此过程的一部分.更新模型向导还对概念模型和映射进行了一些更改,但只有在将对象添加到数据库时才会进行这些更改.例如,将表添加到数据库时,新的实体类型将添加到概念模型中,而将列添加到表中时,新属性将添加到实体类型中.有关对.edmx文件所做更改的详细信息,请参阅更新模型向导对.edmx文件所做的更改.
使用更新模型向导更新数据库时,它更新了.edmx文件中的存储模型,而不是概念模型.当对现有对象的定义进行更改时,仅更新存储模型; 概念模型未更新.有关更新模型向导所做更改的完整说明,请参阅上面的"通过更新模型向导对.edmx文件所做的更改"链接.
以下是有关如何更新未由更新模型向导更新的对象的一些选项(基于更改列定义的方案):
最佳选择取决于给定的方案.例如,如果您只是更改了一列的定义,那么选项1可能是您的最佳选择.如果您更改了单个表中多个列的定义,则选项3可能是您的最佳选择.如果您更改了在多个表(例如主键/外键)中使用的列,则直接编辑.edmx XML可能是您的最佳选择.