我正在尝试使用MySQL(5.5.22,Connector 6.5.4)与Entity Framework 4来开发。
我采用了Model First方法。我成功地从我的模型创建了一个SQL脚本。
现在我想修改我的数据库,并从修改后的数据库更新我的模型(例如,我要向表中添加一个新列,并期望相应实体中添加一个新属性)。这种方法在SQL Server 2008 R2上运作良好。
但是,使用MySQL时,我无法使其工作:更新向导总是显示当前表(这些表已经映射到实体)作为新表,并尝试将新实体添加到模型中而不是更新当前实体。
也许与旧的#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
的新实体,并将 Zone
和 Zones
之间的映射断开,建立 Zone1
和 Zones
之间的新映射。
实体 Zone
和 Zone1
是相同的(完全相同的属性、相同的主键等)。
然后,我尝试删除所有先前的实体,将所有 XXXX1
实体重命名为 XXXX
(例如,我删除了 Zone
实体,然后将 Zone1
重命名为 Zone
)。
然后,我尝试第二次从数据库更新:更新向导按预期工作(没有需要创建的新实体,只有要更新的实体)。
然后,我尝试再次从模型生成 SQL 脚本... 它起作用了... 但是当我再次从数据库更新时,问题又出现了... 更新向导仍在尝试添加新的实体。
编辑3
最终解决了这个问题(感谢 daryal)!问题在于我的数据库模式名称没有在模型属性中指定... 在使用 SQL Server 时,99% 的情况下是 dbo
,但在 MySQL 中默认情况下并非如此。
从数据库更新模型时,SSDL 会根据数据库的实际模式名称进行更新。
但是在再次从模型生成数据库后,错误的数据库模式名称被用来替代正确的名称。这就是为什么再次从 DB 更新时会失败的原因。
哦!