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
相关产品推荐
相关产品推荐

