簡體   English   中英

EF Core 無法執行數據庫更新命令:“失敗:Microsoft.EntityFrameworkCore.Database.Command[20102]”

[英]EF Core failed to execute database update command : " fail: Microsoft.EntityFrameworkCore.Database.Command[20102] "

伙計們,我正在嘗試運行dotnet ef database update命令,但在執行它的過程中,它給我一個異常:

Failed executing DbCommand (12ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE [ProductSubCategory] (
    [ProductId] int NOT NULL,
    [SubCategoryId] int NOT NULL,
    CONSTRAINT [PK_ProductSubCategory] PRIMARY KEY ([SubCategoryId], [ProductId]),
    CONSTRAINT [FK_ProductSubCategory_Product_ProductId] FOREIGN KEY ([ProductId]) REFERENCES [Product] ([ProductId]) ON DELETE CASCADE,
    CONSTRAINT [FK_ProductSubCategory_SubCategory_SubCategoryId] FOREIGN KEY ([SubCategoryId]) REFERENCES [SubCategory] ([SubCategoryId]) ON DELETE CASCADE
);
Microsoft.Data.SqlClient.SqlException (0x80131904): Introducing FOREIGN KEY constraint 'FK_ProductSubCategory_SubCategory_SubCategoryId' on table 'ProductSubCategory' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint or index. See previous errors.
Introducing FOREIGN KEY constraint 'FK_ProductSubCategory_SubCategory_SubCategoryId' on table 'ProductSubCategory' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint or index. See previous errors.

我在我的ASP.NET CORE MVC應用程序中使用Sql Server作為我的數據庫提供程序和實體框架核心 3.19 公平地說,我不確定是什么原因造成的,因為我以前沒有遇到過這樣的麻煩,一旦我添加了外鍵屬性,例如public int CategoryId { get; set; } ,它們就會出現public int CategoryId { get; set; } public int CategoryId { get; set; } public int CategoryId { get; set; }所有依賴的實體(在一對多的關系),如產品,因為我忘了之前添加它們,現在我會以更新使用它們的產品Entities.I'm顯示實體和流暢的API代碼
Product.cs

public class Product
    {
        public int ProductId { get; set; }
        public string Name { get; set; }
        public double Price { get; set; }
        public Category Category { get; set; }
        public int CategoryId { get; set; } //It's one of the foreign keys properties added
        public Brand Brand { get; set; }
        public int BrandId { get; set; }    //It's one of the foreign keys properties added
        public string ImageName { get; set; }
        public IEnumerable<ProductSubCategory> SubCategories { get; set; }
}

ProductSubCategory.cs

public class ProductSubCategory
{
    public int ProductId { get; set; }
    public Product Product { get; set; }
    public int SubCategoryId { get; set; }
    public SubCategory SubCategory { get; set; }
}

SubCategory.cs

public class SubCategory
{
    public int SubCategoryId { get; set; }
    public string Name { get; set; }
    public int CategoryId { get; set; }
    public Category Category { get; set; }
    [JsonIgnore]
    public IEnumerable<ProductSubCategory> ProductSubCategories { get; set; }
}

Category

public class Category
{
    public int CategoryId { get; set; }
    public string Name { get; set; }
    public IEnumerable<Product> Products { get; set; }
    public IEnumerable<SubCategory> SubCategories { get; set; }
}

DbContext.cs

protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
modelBuilder.Entity<ProductSubCategory>()
                .HasKey(psc => new {psc.SubCategoryId, psc.ProductId});
            
            modelBuilder.Entity<ProductSubCategory>()
                .HasOne(psc => psc.Product)
                .WithMany(p => p.SubCategories)
                .HasForeignKey(psc => psc.ProductId);

            modelBuilder.Entity<ProductSubCategory>()
                .HasOne(psc => psc.SubCategory)
                .WithMany(sc => sc.ProductSubCategories)
                .HasForeignKey(psc => psc.SubCategoryId);
}

我很確定我正確配置了關系。
我嘗試過的事情:

  1. 刪除遷移文件夾並創建一個新文件夾。
  2. 將 Ef Core nuget 包更新到最新版本
  3. 刪除數據庫,然后創建一個新數據庫。

PD:請我需要幫助,我沒時間了,如果你想要實體項目的源代碼和它各自的 Dbcontext,我可以給你,但正如我所說,它有 19 個實體類。
這是源代碼: https : //github.com/ToastedGuy2/Food-Town-issue
編輯:真正的問題是如何在每個外鍵中刪除On Cascade On Delete 無論是一對多關系還是多對多關系都沒有關系。

在表 'ProductSubCategory' 上引入 FOREIGN KEY 約束 'FK_ProductSubCategory_SubCategory_SubCategoryId' 可能會導致循環或多個級聯路徑。 指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 約束。

該錯誤實際上是在告訴您這里的問題。 我不確定哪一點不清楚,因為 OP 表示他們一無所知(我必須承認這意味着語言障礙,因此我建議更改您的LOGIN語言以獲取您更熟悉的語言的錯誤) ,但是,我將過度“愚蠢”:

引入 FOREIGN KEY 約束“FK_ProductSubCategory_SubCategory_SubCategoryId”

這是在談論您嘗試創建的FOREIGN KEY ,名為FK_ProductSubCategory_SubCategory_SubCategoryId

在表“ProductSubCategory”上

這告訴你,前面提到的FOREIGN KEY正試圖在表ProductSubCategory上創建

可能會導致循環或多個級聯路徑。

這意味着試圖在上述TABLE上創建的上述FOREIGN KEY將導致循環或多個級聯路徑。

  • 循環意味着DELETE將導致對同一個表的進一步刪除,在同一個表上觸發更多的刪除,在同一個表上觸發更多的刪除,...在同一個表上觸發更多的刪除,...(你得到主意)
  • Multiple Cascade Paths 意味着將有多個其他表將刪除行,這在 SQL Server 中現在是允許的; 特別是如果他們稍后會聚在同一張桌子上。

指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION

我真的不知道如何進一步澄清這一點。 而不是ON CASCADE使用NO ACTION AKA,自己處理級聯。

或修改其他 FOREIGN KEY 約束

同樣,這非常重要地告訴您該怎么做。 修改表上的其他CONSTRAINT ,以免它們導致循環或多條路徑; 必須可能通過將該鍵更改為NO ACTION並自己處理級聯。

嘗試改變

 modelBuilder.Entity<ProductSubCategory>()
                .HasOne(psc => psc.Product)
                .WithMany(p => p.SubCategories)
                .HasForeignKey(psc => psc.ProductId);

 modelBuilder.Entity<ProductSubCategory>()
                .HasOne(psc => psc.Product)
                .WithMany(p => p.ProductSubCategories)
                .HasForeignKey(psc => psc.ProductId);

我通常使用 .OnDelete(DeleteBehavior.ClientSetNull)

EF Core 默認為級聯刪除。 一旦您擁有太多它們,這就會開始引起問題,並且無論如何您都不希望它們到處都是。

在定義您的關系時,您應該嘗試默認不使用級聯,除非您確實需要級聯。

entityBuilder
.HasMany(one => one.Many)
.WithOne(many => many.One)
.OnDelete(DeleteBehavior.NoAction);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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