表 'DBNAME.dbo.TableNAME' 不存在 MySQL 的实体框架 6
Posted
技术标签:
【中文标题】表 \'DBNAME.dbo.TableNAME\' 不存在 MySQL 的实体框架 6【英文标题】:Table 'DBNAME.dbo.TableNAME' doesn't exist Entity Framework 6 with MySQL表 'DBNAME.dbo.TableNAME' 不存在 MySQL 的实体框架 6 【发布时间】:2015-03-18 14:55:42 【问题描述】:我正在使用 Entity Framework 6.0.0 和 mysql Server 5.6.17
我通过 nuget 添加了 MySql.Data.Entities,它安装了 Entity Framework 6.0.0 和 MySql.Data 6.8.4
一切都设置得很完美,并且可以与我的一些业务实体正常工作。它启用了自动迁移(true)。
后来我添加了更多实体,然后它开始给出错误,例如
Table 'DBNAME.dbo.TABLENAME' doesn't exist Entity Framework 6
我尝试删除整个数据库并重新创建它,但没有成功。
我尝试将 Entity Framework 更新到 6.1.2 并将 MySql.Data 更新到 6.9.5,但它没有解决问题但给出了一些其他错误,例如
Method not found: 'System.Data.Entity.Migrations.Builders.TableBuilder`1<!0> System.Data.Entity.Migrations.Builders.TableBuilder`1.Index(System.Linq.Expressions.Expression`1<System.Func`2<!0,System.Object>>, System.String, Boolean, Boolean, System.Object)'.
所以我将我的 EF 和 MySql.Data 更改为以前的版本(EF 6.0.0 和 MySql.Data 6.8.4)
我又找到一篇文章http://bugs.mysql.com/bug.php?id=69649 和我有同样的错误 所以我修改了我的配置方法如下
public Configuration()
this.AutomaticMigrationsEnabled = true;
SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());
CodeGenerator = new MySql.Data.Entity.MySqlMigrationCodeGenerator();
AutomaticMigrationDataLossAllowed = true; // or false in case data loss is not allowed.
但它没有解决问题。我又遇到了同样的错误。
我的示例业务实体如下。
public class User
[Key]
public int UserID get; set;
[Display(Name = "User Email")]
[Allowhtml]
public string UserEmail get; set;
[MaxLength(100)]
[Required(ErrorMessage = "Enter user password")]
[Display(Name = "User Password")]
[AllowHtml]
public string UserPassword get; set;
[MaxLength(50)]
[Display(Name = "First Name")]
[AllowHtml]
public string FirstName get; set;
[MaxLength(50)]
[Display(Name = "Last Name")]
[AllowHtml]
public string LastName get; set;
[Display(Name = "Profile Picture")]
public string ProfilePicURL get; set;
public string SaltKey get; set;
提前感谢您的帮助
【问题讨论】:
您的问题被标记为“mysql”。然而,您正在使用与 SQL Server 关联的三部分命名约定。为 MySQL 使用正确的数据库引用或连接到 SQL Server 数据库。 @GordonLinoff 这就是我遇到的错误。我没有指定任何类似的 AFAIK 我也看到了这个错误。你有想过吗? 【参考方案1】:将迁移中的所有“dbo.
”替换为“”。
即去掉“.dbo
”即可
【讨论】:
【参考方案2】:我今天遇到了这个代码的问题。
DropForeignKey("dbo.BlogPostViews", "BlogPostId", "dbo.BlogPosts");
删除 dbo.解决了我的问题。我有这个。我把它改成
DropForeignKey("BlogPostViews", "BlogPostId", "BlogPosts");
一切正常!我从@andypopa 的答案中得到了这个想法。
【讨论】:
【参考方案3】:How can I stop Entity Framework 5 migrations adding dbo. into key names? 中给出的解决方案可能对您有用。它在几种情况下对我有用。
在您提出这个问题 10 个月后,您可能会有自己的方法。根据我的经验,我不建议使用自动迁移,至少不建议使用 MySQL。您需要手动解决几个不兼容问题。使用自动迁移时,如果您不想丢失数据,则可以轻松破坏数据库并花费数小时尝试修复它。
问题包括:
对列重命名的支持不正确 不支持索引重命名 对代码优先模型的更改在迁移中反映不正确,您需要对其进行调整如果您有兴趣,我有前 2 个的解决方案。最后一步始终是手动步骤。
到目前为止,对我 100% 有效的方法是遵循以下程序:
-
更改代码优先模型
使用 Add-Migration 生成新的迁移
查看生成的代码并确保其正确
用您的固定版本替换列/索引操作
应用迁移
【讨论】:
在某些情况下可能更糟,EF 生成的迁移首先重命名表,然后尝试重命名旧命名表中的列。到目前为止,“update-database -script”的运气最好,然后在我一一执行时微调 sql 查询。【参考方案4】:这是因为表名以 dbo 开头。在 DropIndex 或 DropForeignKey 语句中。如果你这样做了
Update-Database -Verbose
您将看到生成的 SQL 和准确的错误消息:
Can't DROP 'FK_Bunnies_dbo.Carrots_Carrot_CarrotId'; check that column/key exists
实际的 FK 名称是
FK_Bunnies_Carrots_Carrot_CarrotId
看来dbo的存在。粒子只影响 DropIndex、DropForeignKey 语句(我正在运行 EF + MySQL)。 CreateIndex、AddForeignKey 不受此影响!
所以,解决办法就是更换dbo。传递给上述函数的所有参数中没有任何内容。
【讨论】:
【参考方案5】:class SqlGenerator : MySql.Data.Entity.MySqlMigrationSqlGenerator
public override IEnumerable<MigrationStatement> Generate(IEnumerable<MigrationOperation> migrationOperations, string providerManifestToken)
IEnumerable < MigrationStatement > res = base.Generate(migrationOperations, providerManifestToken);
foreach(MigrationStatement ms in res)
ms.Sql = ms.Sql.Replace("dbo.","");
return res;
(...)
SetSqlGenerator("MySql.Data.MySqlClient", new SqlGenerator());
更好的解决方案: 当我重新启动应用程序时,EF 总是想再次删除并创建外键约束,所有这些奇怪的 sql 操作都包含“dbo”。架构。我只是忽略它们。
foreach(MigrationStatement ms in res)
//ms.Sql = ms.Sql.Replace("dbo.","");
if(ms.Sql.Contains("dbo."))
return new List<MigrationStatement>();
【讨论】:
您能否在答案中添加更多细节?谢谢 @MichalB 你提到的是正确的。可以在bugs.mysql.com/bug.php?id=69649 找到更多信息。【参考方案6】:您的架构实际上是 dbo 吗? dbo 是 EF 中的默认值。您可以通过使用Table
属性并提供新的Schema
名称在实体上更改此设置。
[Table("TableName", Schema = "schemaName")]
【讨论】:
【参考方案7】:我遇到了同样的错误,我正在使用 MySQL 和 CodeFirst。我刚刚删除了数据库并重新启动了应用程序。这解决了我的问题。
【讨论】:
问题与外键有关。这篇文章解决了问题***.com/questions/12053627/…以上是关于表 'DBNAME.dbo.TableNAME' 不存在 MySQL 的实体框架 6的主要内容,如果未能解决你的问题,请参考以下文章