【问题标题】:EF code first - Cycles or multiple cascade pathsEF 代码优先 - 循环或多个级联路径
【发布时间】:2021-10-17 14:44:21
【问题描述】:

我正在制作一个投票系统。一个Poll 可以有任意数量的PollOptions。 Vote 可以为空(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.
}

迁移时,我遇到了错误消息

在表“Votes”上引入 FOREIGN KEY 约束“FK_Votes_Polls_PollId”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

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

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

如果没有,我该怎么做?

我的尝试:

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

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

【问题讨论】:

    标签: c# database-design ef-code-first


    【解决方案1】:

    尝试为投票添加投票

    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 也可以为空会很有用

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

    【讨论】:

    • 谢谢。有效。让PollId 可以为空有什么意义?
    • 不客气!它是可选的。我不确定添加选票是否足够。
    猜你喜欢
    • 2018-08-03
    • 2015-05-17
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    相关资源
    最近更新 更多