这件事我已经纠结了一段时间了,我不太明白发生了什么事.我有一个卡片实体,它包含两个侧面(通常是2个)-而且卡片和侧面都有一个舞台.我正在使用EF CodeFirst迁移,迁移失败,错误如下:

引入外键约束‘fk_dbo.Sides_dbo.Cards_CardId’on 表‘侧’可能导致循环或多个级联路径.指定启用 DELETE NOT ACTION或ON UPDATE NO ACTION,或修改其它外键 约束.

以下是我的Card个实体:

public class Card
{
    public Card()
    {
        Sides = new Collection<Side>();
        Stage = Stage.ONE;
    }

    [Key]
    [Required]
    public virtual int CardId { get; set; }

    [Required]
    public virtual Stage Stage { get; set; }

    [Required]
    [ForeignKey("CardId")]
    public virtual ICollection<Side> Sides { get; set; }
}

以下是我的Side个实体:

public class Side
{
    public Side()
    {
        Stage = Stage.ONE;
    }

    [Key]
    [Required]     
    public virtual int SideId { get; set; } 

    [Required]
    public virtual Stage Stage { get; set; }

    [Required]
    public int CardId { get; set; }

    [ForeignKey("CardId")]
    public virtual Card Card { get; set; }

}

这是我的Stage个实体:

public class Stage
{
    // Zero
    public static readonly Stage ONE = new Stage(new TimeSpan(0, 0, 0), "ONE");
    // Ten seconds
    public static readonly Stage TWO = new Stage(new TimeSpan(0, 0, 10), "TWO");

    public static IEnumerable<Stage> Values
    {
        get
        {
            yield return ONE;
            yield return TWO;
        }

    }

    public int StageId { get; set; }
    private readonly TimeSpan span;
    public string Title { get; set; }

    Stage(TimeSpan span, string title)
    {
        this.span = span;
        this.Title = title;
    }

    public TimeSpan Span { get { return span; } }
}

奇怪的是,如果我在Stage类中添加以下内容:

    public int? SideId { get; set; }
    [ForeignKey("SideId")]
    public virtual Side Side { get; set; }

迁移成功运行.如果我打开SSM并查看表格,我可以看到Stage_StageId已添加到Cards(如预期/所需),但是Sides未包含对Stage(非预期)的引用.

如果我随后添加

    [Required]
    [ForeignKey("StageId")]
    public virtual Stage Stage { get; set; }
    public int StageId { get; set; }

在我的副课上,我看到Side表中增加了StageId列.

这是可行的,但在我的整个应用程序中,对Stage的任何引用都包含SideId,在某些情况下,这是完全无关的.I'd like to just give my 102 and 103 entities a 100 property based on the above Stage class without polluting the stage class with reference properties if possible... 我做错了什么?

推荐答案

因为Stagerequired,所以涉及Stage的所有一对多关系在默认情况下都将启用级联删除.这意味着,如果你删除了Stage个实体

  • 删除将直接级联到Side
  • 删除将直接级联到Card,因为CardSide与默认情况下再次启用的级联删除具有必需的一对多关系,所以它将从Card级联到Side

因此,您有两个从StageSide的级联删除路径-这会导致异常.

必须在至少一个实体中选择Stage(即从Stage属性中删除[Required]属性),或使用Fluent API禁用级联删除(数据注释不可能):

modelBuilder.Entity<Card>()
    .HasRequired(c => c.Stage)
    .WithMany()
    .WillCascadeOnDelete(false);

modelBuilder.Entity<Side>()
    .HasRequired(s => s.Stage)
    .WithMany()
    .WillCascadeOnDelete(false);

.net相关问答推荐

如何规范机器之间连字符的排序顺序?

参数命名:文件名还是文件名?

如何在 ASP.NET Core 中使用 Bootstrap 4

如何在不违反继承安全规则的情况下在 .NET 4+ 中实现 ISerializable?

如何从 appsettings.json 中获取价值

我可以先使用 EF 代码和 .net 核心生成迁移脚本吗

Web API 中基于令牌的身份验证,无需任何用户界面

如何指定托管 ASP.NET Core 应用程序的端口?

Resharper Ctrl-T 映射丢失

没有科学记数法的双精度字符串转换

IIS Express - 500.19 无法读取配置文件 - 因为它正在查看错误的路径

Roslyn 编译代码失败

HttpClient 和使用代理 - 不断得到 407

关于 Task.Start() 、 Task.Run() 和 Task.Factory.StartNew() 的使用

为什么我不能在 lambda 表达式中使用空传播运算符?

Web API 2:如何在对象及其子对象上返回带有驼峰式属性名称的 JSON

使用 C# 设置全局热键

Windows 更新导致 MVC3 和 MVC4 停止工作

如何从标头中检索基本身份验证凭据?

找不到 Microsoft.Office.Interop Visual Studio