我正在使用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; }
}
感谢您提前提供任何帮助
答案 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%有效的方法是遵循以下程序:
答案 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
”