SQL Server EF核心-调用SaveChanges()时出现错误消息:“实体类型之间的关联已断开,...”

q3qa4bjr  于 2022-12-22  发布在  其他
关注(0)|答案(1)|浏览(167)

我有以下数据模型

public class SportEvent
{
    [Key]
    public int Id { get; set; }
    
    public int QualifierLeaderboardId { get; set; }
    public Leaderboard QualifierLeaderboard { get; set; }
    public int FinalLeaderboardId { get; set; }
    public Leaderboard FinalLeaderboard { get; set; }
}

public class Leaderboard
{
    [Key]
    public int Id { get; set; }
    public List<Ranking> Rankings { get; set; }
    public int LeaderboardSportEventId { get; set; }
    public SportEvent LeaderboardSportEvent { get; set; }
}

一个SportEvent恰好有两个排行榜-一个用于预选赛,一个用于决赛。一个排行榜恰好有一个SportsEvent。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<SportEvent>()
                .HasOne(s => s.QualifierLeaderboard)
                .WithOne()
                .HasForeignKey<SportEvent>(s => s.QualifierLeaderboardId)
                .OnDelete(DeleteBehavior.NoAction);

    modelBuilder.Entity<SportEvent>()
                .HasOne(s => s.FinalLeaderboard)
                .WithOne()
                .HasForeignKey<SportEvent>(s => s.FinalLeaderboardId)
                .OnDelete(DeleteBehavior.NoAction);

    modelBuilder.Entity<Leaderboard>()
                .HasOne(l => l.LeaderboardSportEvent)
                .WithOne()
                .HasForeignKey<Leaderboard>(l => l.LeaderboardSportEventId)
                .OnDelete(DeleteBehavior.NoAction);
}

因此,我配置了从SportEvent到排行榜的两个关系和排行榜上的一个导航属性。

SportEvent sportEvent = new SportEvent();
Leaderboard finalLeaderboard = new Leaderboard() { LeaderboardSportEvent = sportEvent};
Leaderboard qualificationLeaderboard = new Leaderboard() { LeaderboardSportEvent = sportEvent };
sportEvent.FinalLeaderboard = finalLeaderboard;
sportEvent.QualifierLeaderboard= qualificationLeaderboard;

try
{
    TestingContext context = new TestingContext();
    context.SportEvents.Add(sportEvent);

    context.SaveChanges();
}
catch (Exception ex)
{
    System.Diagnostics.Debug.WriteLine(ex.Message);
}

当我尝试添加数据并将更改保存到数据库时,发生以下异常。

System.InvalidOperationException: 'The association between entity types 'SportEvent' and 'Leaderboard' has been severed, 
but the relationship is either marked as required or is implicitly required because the foreign key is not nullable. 
If the dependent/child entity should be deleted when a required relationship is severed, configure the relationship to use cascade deletes. 
Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see the key values.'

我已经看了很多其他职位,但无法解决它。非常感谢您的帮助。

ifmq2ha2

ifmq2ha21#

如果你把SportEvent的属性赋给它的相关实体,并不意味着你不必把它们添加到数据库中。当你保存更改时,DbContext会发现一个断开的关系并抛出异常。你应该保存所有实体:

SportEvent sportEvent = new SportEvent();
Leaderboard finalLeaderboard = new Leaderboard() { LeaderboardSportEvent = sportEvent, LeaderboardSportEventId = sportEvent.Id };
Leaderboard qualificationLeaderboard = new Leaderboard() { LeaderboardSportEvent = sportEvent, LeaderboardSportEventId = sportEvent.Id };
sportEvent.FinalLeaderboard = finalLeaderboard;
sportEvent.FinalLeaderboardId = finalLeaderboard.Id;
sportEvent.QualifierLeaderboard = qualificationLeaderboard;
sportEvent.QualifierLeaderboardId = qualificationLeaderboard.Id;

try
{
    TestingContext context = new TestingContext();
    context.SportEvents.Add(sportEvent);
    context.Leaderboards.Add(finalLeaderboard);
    context.Leaderboards.Add(qualificationLeaderboard);

    context.SaveChanges();
}
catch (Exception ex)
{
    System.Diagnostics.Debug.WriteLine(ex.Message);
}

相关问题