You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 6 Web API EF外键循环/多级联路径问题解决

EF Core 一对一关系中外键配置与级联删除问题解决

这是我开发的第一个基于Entity Framework(EF)的ASP.NET Core 6 Web API项目,我想在UserDetail和Menu实体里把PersonalId设为外键,但试了好多次都没搞定。以下是实体模型定义和OnModelCreating中的Fluent API配置代码:

public class User
{
    public int Id { get; set; }

    public UserDetail? UserDetail { get; set; }

    public int PersonalId { get; set; }
    public string? Password { get; set; }
}

public class UserDetail
{
    [Key]
    public int Id { get; set; }

    public int PersonalId { get; set; }

    public int UserId { get; set; }
    public User? User { get; set; }

    public UserDetailsRole Role { get; set; }

    public string? FullName { get; set; }

    public Menu? Menu { get; set; }
}

public class Menu
{
    [Key]
    public int Id { get; set; }

    public int PersonalId { get; set; }

    public int UserDetailId { get; set; }
    public UserDetail? UserDetail { get; set; }

    [MaxLength(20)]
    public string? Monday { get; set; }
    .....
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>()
        .HasOne(u => u.UserDetail)
        .WithOne(ud => ud.User)
        .HasForeignKey<User>(u => u.PersonalId);

    modelBuilder.Entity<Menu>()
        .HasOne(m => m.UserDetail)
        .WithOne()
        .HasForeignKey<Menu>(m => m.PersonalId);

    modelBuilder.Entity<UserDetail>()
        .HasOne(ud => ud.User)
        .WithOne(u => u.UserDetail)
        .HasForeignKey<User>(u => u.Id)
        .OnDelete(DeleteBehavior.NoAction);
}

运行时出现如下错误:

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

最终通过调整Fluent API中的级联删除规则解决了问题,修正后的配置代码如下:

modelBuilder.Entity<User>()
            .HasOne(u => u.UserDetail)
            .WithOne(ud => ud.User)
            .HasForeignKey<User>(u => u.PersonalId)
            .OnDelete(DeleteBehavior.Restrict)
            .IsRequired(false);

modelBuilder.Entity<UserDetail>()
            .HasOne(u => u.Menu)
            .WithOne(ud => ud.UserDetail)
            .HasForeignKey<Menu>(u => u.PersonalId)
            .OnDelete(DeleteBehavior.Restrict)
            .IsRequired(false);

modelBuilder.Entity<UserDetail>()
            .HasOne(u => u.Transit)
            .WithOne(ud => ud.UserDetail)
            .HasForeignKey<Transit>(u => u.PersonalId)
            .OnDelete(DeleteBehavior.Restrict)
            .IsRequired(false);

内容的提问来源于stack exchange,提问作者Maryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 00:05:33