EF 代码优先 - 循环或多个级联路径

EF code first - Cycles or multiple cascade paths

我正在制作一个投票系统。一个 Poll 可以有任意数量的 PollOptionVote 可以为空(PollOptionId 为空)。

我的模特:

public class Poll
{
    public Guid Id { get; set; }
    public List<PollOption> Options { get; set; }
    // Some more properties.
}

public class PollOption
{
    public Guid Id { get; set; }
    public Guid PollId { get; set; }
    public Poll Poll { get; set; }
    public List<Vote> Votes { get; set; }
    // Some more properties.
}

public class Vote
{
    public Guid Id { get; set; }
    public Guid PollId { get; set; } // Needed for blank votes
    public Poll Poll { get; set; }
    public Guid? PollOptionId { get; set; } // Null if blank vote
    public PollOption Option { get; set; }
    // Some more properties.
}

迁移后,我遇到错误消息

Introducing FOREIGN KEY constraint 'FK_Votes_Polls_PollId' on table 'Votes' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

我可以看到循环,但我不确定如何根据我的目的使我的模型有所不同。

是否可以更改设计以避免需要在模型构建器中添加 ON DELETE NO ACTION?

如果没有,我该怎么做?

我的尝试:

modelBuilder.Entity<Vote>()
    .HasOne(p => p.Poll)
    .WithMany(o => o.Options)
    .OnDelete(DeleteBehavior.Restrict);

... 这当然是行不通的,因为 PollOption != Vote.

尝试在投票中添加选票

public class Poll
{
    public Guid Id { get; set; }
    public virtual List<PollOption> Options { get; set; }
    public virtual List<Vote> Votes{ get; set; } 
    // Some more properties.
}

也许让 PollId 也可以为 null 会很有用

public class Vote
{
    public Guid Id { get; set; }
    .....
    public Guid? PollId { get; set; } 
    public virtual Poll Poll { get; set; }
    .....
}