【问题标题】:EF Core may cause cycles or multiple cascade paths failureEF Core 可能会导致循环或多个级联路径失败
【发布时间】:2021-08-12 22:56:18
【问题描述】:

我正在尝试设置模型构建器级联属性,但语法不正确。

简单的数据库:

我有一堂课(ReqForBetaReader):

public class ReqForBetaReader
{
   public ReqForBetaReader()
   {
      Tags = new List<TagForReqBeta>();
   }

        public Guid Id { get; set; }
        public string Title { get; set; }
        public string Synopsis { get; set; }
        public int WordCount { get; set; }
        public Guid AuthorId { get; set; }
        public virtual User Author { get; set; }
        public DateTime UpdatedOn { get; set; }
        public virtual ICollection<TagForReqBeta> Tags { get; set; }
}

我有我的 TagForReqBeta 课程

 public class TagForReqBeta
    {
        public int Id { get; set; }

        [Required]
        public string Name { get; set; }

        [Required]
        public Guid ReqForBetaReaderId { get; set; }
        public virtual ReqForBetaReader ReqForBetaReader { get; set; }

        [Required]
        public Guid UserId { get; set; }
        public virtual User User { get; set; }
        public DateTime AddedOn { get; set; }
    }

所以一个 ReqForBeta 可以有多个标签。

当我运行 Update-Database 时,我感到很害怕:

Introducing FOREIGN KEY constraint 'FK_TagsOnRequestForBetaReaders_RequestsForBetaReaders_ReqForBetaReaderId' on table 'TagsOnRequestForBetaReaders' 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.

我相信这意味着当我删除 ReqForBeta 时,我也应该删除所有 TagForReqBeta,但是我遇到了语法问题。有什么帮助吗?

protected override void OnModelCreating(ModelBuilder builder)
        {
            builder.Entity<ReqForBetaReader>()
                .HasMany<TagForReqBeta>(x => x.Tags)
                .WithOne<ReqForBetaReader>(x => x.ReqForBetaReaderId)
                .OnDelete(DeleteBehavior.Cascade);

            base.OnModelCreating(builder);
        }

【问题讨论】:

标签: entity-framework asp.net-core entity-framework-core


【解决方案1】:

由于 ReqForBetaReaderId 不可为空,当您删除 ReqForBetaReader 记录时,您将不得不删除 TagForReqBeta。

据我了解,同一标签可用于多条记录,您必须使 ReqForBetaReaderId 为空

[Required]
public Guid? ReqForBetaReaderId { get; set; }

builder.Entity<ReqForBetaReader>()
                .HasMany<TagForReqBeta>(x => x.Tags)
                .WithOne<ReqForBetaReader>(x => x.ReqForBetaReaderId)
                .OnDelete(DeleteBehavior.ClientSetNull);

正如@IvanStoev 注意到你对用户有同样的问题

【讨论】:

    猜你喜欢
    • 2020-02-04
    • 2019-09-22
    • 2020-06-14
    • 2022-01-05
    • 2018-08-04
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 2016-07-22
    相关资源
    最近更新 更多