表'DBNAME.dbo.TableNAME'不存在与MySQL的实体框架6

时间:2015-01-20 11:33:01

标签: c# mysql entity-framework entity-framework-6

我正在使用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

我尝试删除整个数据库并重新创建它,但它没有用。

我已经尝试将实体框架更新到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; }
}

感谢您提前提供任何帮助

7 个答案:

答案 0 :(得分:9)

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>();
    }
}

答案 1 :(得分:2)

我遇到了同样的错误,我正在使用MySQL和CodeFirst。我刚刚删除了数据库并重新启动了应用程序。这解决了我的问题。

答案 2 :(得分:2)

这是因为表名以dbo开头。在DropIndex或DropForeignKey语句中。如果你这样做

Update-Database -Verbose

你会看到生成的SQL&amp;准确的错误信息:

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。没有将所有参数传递给上述函数。

答案 3 :(得分:1)

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

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

问题包括:

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

如果您有兴趣,我有前2个解决方案。最后一个始终是手动步骤。

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

  1. 更改代码优先模型
  2. 使用添加迁移生成新迁移
  3. 查看生成的代码并确保其正确
  4. 用固定版本替换列/索引操作
  5. 应用迁移

答案 4 :(得分:1)

今天我用这个代码解决了这个问题。

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

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

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

一切正常!我从@andypopa的答案中得到了这个想法。

答案 5 :(得分:0)

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

[Table("TableName", Schema = "schemaName")]

答案 6 :(得分:0)

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

也就是说,只需删除“。dbo