Table 'DBNAME.dbo.TableNAME' 不存在 Entity Framework 6 MySQL

Table 'DBNAME.dbo.TableNAME' doesn't exist Entity Framework 6 with MySQL

我正在使用 Entity Framework 6.0.0 和 MySql 服务器 5.6.17

我通过 nuget 添加了 MySql.Data.Entities,它安装了 Entity Framework 6.0.0 和 MySql.Data 6.8.4

一切都设置得很完美,并且可以与我的一些业务实体一起正常工作。它启用了自动迁移(真)。

后来我又添加了一些实体,然后它开始报错

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 和 CodeFirst。我刚刚删除了数据库并重新启动了应用程序。这解决了我的问题。

您的架构实际上是 dbo 吗? dbo 在 EF 中是默认的。您可以使用 Table 属性并提供新的 Schema 名称来更改实体上的此项。

[Table("TableName", Schema = "schemaName")]
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>();
    }
}

这是因为 table 名称以 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。没有传递给上述函数的所有参数。

How can I stop Entity Framework 5 migrations adding dbo. into key names?中给出的解决方案可能适合您。它在几个案例中对我有用。

在您提出这个问题 10 个月后,您可能会有自己的方法。根据我的经验,我不建议使用自动迁移,至少不建议使用 MySQL。您需要手动解决几个不兼容问题。使用自动迁移时,如果不想丢失数据,很容易破坏数据库并花费数小时来修复它。

问题包括:

  • 对列重命名的支持不正确
  • 不支持索引重命名
  • 对代码优先模型的更改在迁移中反映不正确,您需要调整它们

如果你有兴趣,我有前两个的解决方案。最后一个总是手动步骤。

到目前为止对我 100% 有效的方法是遵循以下程序:

  1. 更改代码优先模型
  2. 使用 Add-Migration 生成新迁移
  3. 检查生成的代码并确保它是正确的
  4. 用您的固定版本替换 column/index 操作
  5. 应用迁移

我今天遇到了这个代码的问题。

DropForeignKey("dbo.BlogPostViews", "BlogPostId", "dbo.BlogPosts");

消除 dbo.solved 我的问题。我有这个。我把它改成了

DropForeignKey("BlogPostViews", "BlogPostId", "BlogPosts");

一切正常!我从@andypopa 的回答中得到了灵感。

将迁移中的所有“dbo.”替换为“”。

也就是去掉“.dbo