簡體   English   中英

表'DBNAME.dbo.TableNAME'不存在與MySQL的實體框架6

[英]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%有效的方法是遵循以下程序:

  1. 更改代碼優先模型
  2. 使用Add-Migration生成新的遷移
  3. 查看生成的代碼並確保它是正確的
  4. 用固定版本替換列/索引操作
  5. 應用遷移

今天我用這個代碼解決了這個問題。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM