实体框架 - 引入外键约束可能会导致周期

问题描述 投票:1回答:2

我正在开发一个ASP.NET Core(2.0)Web App,我有以下两个类:

1.团队课

public class Team
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    public string ImageUrl { get; set; }
}

2.匹配课程

public class Match
{
    public int Id { get; set; }
    public DateTime Date { get; set; }
    [Required]
    public virtual Team Team1 { get; set; }
    [Required]
    public virtual Team Team2 { get; set; }
    public int ScoreTeam1 { get; set; }
    public int ScoreTeam2 { get; set; }
}

当我尝试更新数据库时,我收到以下错误:

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

将两个外键之一转为可选不是一个选项。我看到了多个线程,但它们大部分被弃用(即它们使用DbModelBuilder或HasRequired)。

我该如何解决这个问题?谢谢!

c# asp.net entity-framework
2个回答
2
投票

我相信你仍然使用像这样描述here的模型构建器来做...

public class MatchContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder
            .Entity<Match>()
            .HasOne<Team>(e => e.Team1)
            .WithMany(e => e.Matches)
            .OnDelete(DeleteBehavior.Restrict);
    }
}

public class Team
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    public string ImageUrl { get; set; }

    public ICollection<Match> Matches { get; set; }
}

public class Match
{
    public int Id { get; set; }
    public DateTime Date { get; set; }
    [Required]
    public virtual Team Team1 { get; set; }
    [Required]
    public virtual Team Team2 { get; set; }
    public int ScoreTeam1 { get; set; }
    public int ScoreTeam2 { get; set; }
}

如果您尝试删除由一个或多个匹配引用的Team,则Restrict将不执行任何会导致异常的操作。这里描述了其他替代方案......

https://docs.microsoft.com/en-us/ef/core/saving/cascade-delete


1
投票

我认为你应该使用流利的风格与OnDelete合作。可能会有所帮助:https://www.learnentityframeworkcore.com/configuration/fluent-api/ondelete-method

© www.soinside.com 2019 - 2024. All rights reserved.