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% 有效的方法是遵循以下程序:
- 更改代码优先模型
- 使用 Add-Migration 生成新迁移
- 检查生成的代码并确保它是正确的
- 用您的固定版本替换 column/index 操作
- 应用迁移
我今天遇到了这个代码的问题。
DropForeignKey("dbo.BlogPostViews", "BlogPostId", "dbo.BlogPosts");
消除 dbo.solved 我的问题。我有这个。我把它改成了
DropForeignKey("BlogPostViews", "BlogPostId", "BlogPosts");
一切正常!我从@andypopa 的回答中得到了灵感。
将迁移中的所有“dbo.
”替换为“”。
也就是去掉“.dbo
”
我正在使用 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% 有效的方法是遵循以下程序:
- 更改代码优先模型
- 使用 Add-Migration 生成新迁移
- 检查生成的代码并确保它是正确的
- 用您的固定版本替换 column/index 操作
- 应用迁移
我今天遇到了这个代码的问题。
DropForeignKey("dbo.BlogPostViews", "BlogPostId", "dbo.BlogPosts");
消除 dbo.solved 我的问题。我有这个。我把它改成了
DropForeignKey("BlogPostViews", "BlogPostId", "BlogPosts");
一切正常!我从@andypopa 的回答中得到了灵感。
将迁移中的所有“dbo.
”替换为“”。
也就是去掉“.dbo
”