2012-03-30 238 views
4

我试图用实体框架4使用MySQL(5.5.22,连接器6.5.4)。如何从MySQL数据库更新实体框架模型?

我正在使用模型优先的方法。我成功地从我的模型中创建了一个SQL脚本。

现在我想修改我的数据库,然后从修改过的数据库更新我的模型(例如,我将一个新列添加到一个表中,并且我期待将一个新属性添加到相应的实体中) 。 这种方法适用于SQL Server 2008 R2

的MySQL,我不能让它工作:更新向导总是显示我目前的表(已经映射到实体)为新表,并尝试新的实体添加到模型代替更新当前实体。

enter image description here

也许有一些相关的old #48875 bugCREATE INDEX modifies the table name case):MySQL的力量我的表名是小写,但这些表在MSL为驼峰映射...

它实际上是可能的让MySQL和Entity Framework在没有所有这些问题的情况下一起工作?


编辑

如果它可以帮助,手动重命名表时使用骆驼情况下

rename table mytable to mytable_bis 
rename table mytable_bis to MyTable 

它不工作得更好。


EDIT 2

如果接受从这些表创建新的实体,有什么 差异,你可以注意到了吗?例如,如果您生成的 表具有主键,那么请注意。

当从现有表中接受在更新向导中添加新实体时,它创建的实体与名称末尾的1一样被调用。

例如,我目前有一个名为Zone的简单实体与名为Zones的表关联。在从数据库更新之后,它会创建一个名为Zone1的与该表关联的新实体。 ZoneZones之间的映射被破坏,并且在Zone1Zones之间建立了新的映射。

ZoneZone1实体是相同的(完全相同的属性,相同的主键等)。

我再试图删除我以前的所有实体,并更名为我所有XXXX1实体XXXX(例如,我删除了Zone实体然后改名Zone1Zone)。

然后我试着从数据库中第二次更新:更新向导按预期工作(不需要创建新实体,只需要更新实体)。

然后我试图重新生成模型的SQL脚本....它的工作......但后来我试图从数据库再次更新和问题回来......更新向导仍在尝试添加新的实体。


编辑3

最后解决了该问题(感谢daryal)!问题是我的数据库模式名称未在模型属性中指定......使用SQL Server时,它的值为99%,但默认情况下不是这种情况。

从数据库更新模型时,根据数据库的实际模式名称更新SSDL。

但是,在从模型中再次生成数据库之后,使用错误的数据库模式名称代替好的数据库模式名称。这就是为什么在从数据库重新更新时失败的原因。

D'oh!

enter image description here

+0

如果您接受从这些表中创建新实体,您可以注意到哪些差异?例如,如果您生成的表具有主键,那么请注意。 – 2012-03-30 15:12:48

+0

@vucetica请查看更新后的答案 – ken2k 2012-03-30 15:50:33

回答

3

首先我要说,这是不是一个直接的答案;但可能会指导您解决问题。 首先使用xml编辑器打开edmx文件(右键单击edmx文件并选择打开)。在edmx文件中有一些与object-db映射相关的部分,其中三个非常重要。有ConceptualModels,StorageModels和映射节点。在存储节点,检查表的名称是否正确:

<EntitySet Name="MasterSet" EntityType="Model1.Store.MasterSet" store:Type="Tables" Schema="dbo" /> 

如果表名是不正确的,只是改变他们,并更新相关数据的映射部分。

+0

感谢您的回答,我发现问题所在。我检查了SSDL,表格名称一切正常......但模式是'dbo',而不是我真正的模式名称......查看更新的问题以获取完整的如何解决问题的详细信息。为你50荣誉,谢谢! (编辑:我现在不能给你那50分,我得等20个小时;)) – ken2k 2012-04-03 15:13:48

+0

很高兴帮助你,其实你解决了这个问题,我有协助。 – daryal 2012-04-03 15:27:38

+1

这非常有帮助,谢谢!我一直在编辑edmxfiles这个问题的数周。 – 2016-04-24 19:45:45

相关问题