EF Core 可能会导致循环或多个级联路径故障

时间:2021-05-24 16:08:48

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

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

简单数据库:

我有一个类(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);
        }

1 个答案:

答案 0 :(得分:0)

由于 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 注意到你和 User 有同样的问题

相关问题