表 '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的主要内容,如果未能解决你的问题,请参考以下文章

SQL 跨服务器查询

如何把二维表转成一维表

如何实现多表关联查询

MySQL表连接之驱动表与被驱动表

数据结构:线性表顺序表以及单链表详解

1.19.5.3.时态表关联一张版本表关联一张普通表时态表声明版本表声明版本视图声明普通表时态表函数等