如何从MySQL数据库更新Entity Framework模型?

5

我正在尝试使用MySQL(5.5.22,Connector 6.5.4)与Entity Framework 4来开发。

我采用了Model First方法。我成功地从我的模型创建了一个SQL脚本。

现在我想修改我的数据库,并从修改后的数据库更新我的模型(例如,我要向表中添加一个新列,并期望相应实体中添加一个新属性)。这种方法在SQL Server 2008 R2上运作良好。

但是,使用MySQL时,我无法使其工作:更新向导总是显示当前表(这些表已经映射到实体)作为新表,并尝试将新实体添加到模型中而不是更新当前实体。

enter image description here

也许与旧的#48875错误CREATE INDEX modifies the table name case)有关:MySQL强制我的表名小写,但这些表在MSL中映射为驼峰式...

实际上是否可能使MySQL和Entity Framework在没有所有这些问题的情况下协同工作呢?


编辑

如果可以帮助,手动将表重命名为驼峰式

rename table mytable to mytable_bis
rename table mytable_bis to MyTable

它不能更好地运行。


编辑2

如果您同意从这些表中创建新实体,您能注意到什么不同吗?例如,我会注意是否有主键生成的表。

在接受从现有表添加新实体的更新向导时,它会创建名为现有实体名称后跟 1 的实体。

例如,我当前有一个简单的名为 Zone 的实体与名为 Zones 的表相关联。从数据库更新后,它会创建一个名为 Zone1 的新实体,并将 ZoneZones 之间的映射断开,建立 Zone1Zones 之间的新映射。

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

然后,我尝试删除所有先前的实体,将所有 XXXX1 实体重命名为 XXXX(例如,我删除了 Zone 实体,然后将 Zone1 重命名为 Zone)。

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

然后,我尝试再次从模型生成 SQL 脚本... 它起作用了... 但是当我再次从数据库更新时,问题又出现了... 更新向导仍在尝试添加新的实体。


编辑3

最终解决了这个问题(感谢 daryal)!问题在于我的数据库模式名称没有在模型属性中指定... 在使用 SQL Server 时,99% 的情况下是 dbo,但在 MySQL 中默认情况下并非如此。

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

但是在再次从模型生成数据库后,错误的数据库模式名称被用来替代正确的名称。这就是为什么再次从 DB 更新时会失败的原因。

哦!

enter image description here


如果您同意从这些表中创建新实体,您能注意到哪些差异?例如,我会关注您生成的表是否具有主键。 - Aleksandar Vucetic
2个回答

3

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

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

如果表名不正确,只需更改它们并在映射部分更新相关数据即可。

我通过你的回答找到了问题所在。我检查了SSDL,表名一切正常...但模式是dbo而不是我的实际模式名称...请参见更新的问题以获取完整的修复详细信息。为你点赞50个,谢谢!(编辑:我现在无法给你这50分,我必须等待20个小时;) - ken2k
很高兴能帮助你,事实上是你解决了问题,我只是提供了协助。 - daryal
1
这非常有帮助,谢谢!由于这个问题,我已经手动编辑edmx文件几周了。 - Code Magician

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接