![](/img/trans.png)
[英]Table 'dbname.dbname.tablename' doesn't exists error in Visual Studio when adding Mysql Entity Framework
[英]Table 'DBNAME.dbo.TableNAME' doesn't exist Entity Framework 6 with MySQL
我正在使用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; }
}
在此先感謝您的幫助
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>();
}
}
我有同樣的錯誤,我正在使用MySQL和CodeFirst。 我剛剛刪除了數據庫並重新啟動了應用程序。 這解決了我的問題。
發生這種情況是因為表名以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。 沒有將所有參數傳遞給上述函數。
在如何停止添加dbo的Entity Framework 5遷移中給出的解決方案。 成為關鍵名稱? 可能適合你。 在幾個案例中它確實對我有用。
在您提出這個問題10個月后,您可能有自己的方法。 根據我的經驗,我不建議使用自動遷移,至少不使用MySQL。 您需要手動解決幾個不兼容問題。 使用自動遷移時,如果您不想丟失數據,則可以輕松破壞數據庫並花費數小時嘗試修復它。
問題包括:
如果您有興趣,我有前2個解決方案。 最后一個始終是手動步驟。
到目前為止,對我100%有效的方法是遵循以下程序:
今天我用這個代碼解決了這個問題。
DropForeignKey("dbo.BlogPostViews", "BlogPostId", "dbo.BlogPosts");
刪除dbo.solved我的問題。 我有這個。 我改成了
DropForeignKey("BlogPostViews", "BlogPostId", "BlogPosts");
一切正常! 我從@andypopa的答案中得到了這個想法。
你的架構真的是dbo嗎? dbo是EF中的默認值。 您可以使用Table
屬性並提供新的Schema
名稱在實體上更改此設置。
[Table("TableName", Schema = "schemaName")]
將遷移中的所有“ dbo.
”替換為“”。
也就是說,只需刪除“ dbo
”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.