微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SqlException: 在删除级联不工作 ASP.NET

如何解决SqlException: 在删除级联不工作 ASP.NET

当我尝试从 ASP.NETUsers 表中删除用户时,我收到 sqlException:

sqlException: DELETE 语句与 REFERENCE 冲突 约束“FK_Applications_AspNetUsers_UserID”。冲突发生 在数据库“JobGuide”中,表“dbo.Applications”,列“UserID”。

出现此问题是因为用户的 ID 是另一个表中的外键,但“删除级联”不起作用。有关更多详细信息,这是我的模型:

我的扩展身份用户

public class AppUser : IdentityUser
{
    public string Name { get; set; }
    public string City { get; set; }
    public string RoleName { get; set; }

    public virtual ICollection<Application> Applications { get; set; }
}

申请模型(即当用户申请工作时):

public class Application
{
    public int ApplicationID { get; set; }

    public int JobID { get; set; }
    public virtual Job Job { get; set; }
    
    public string UserID { get; set; }
    public virtual AppUser User { get; set; }
}

工作模式:

public class Job
{
    public int JobID { get; set; }
    public string Title { get; set; }

    public virtual ICollection<Application> Applications { get; set; }
}

到目前为止,我创建了两个一对多关系,AspNetUser 与 Application 一对多,Job 与 Application 一对多。

这是我的 Fluent API 映射配置:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    builder.Entity<Application>()
        .HasKey(i => i.ApplicationID);

    builder.Entity<Application>()
           .HasOne<AppUser>(sc => sc.User)
           .WithMany(s => s.Applications)
           .HasForeignKey(sc => sc.UserID)
           .OnDelete(DeleteBehavior.Cascade);

    builder.Entity<Application>()
           .HasOne<Job>(sc => sc.Job)
           .WithMany(s => s.Applications)
           .HasForeignKey(sc => sc.JobID)
           .OnDelete(DeleteBehavior.Cascade);
}

从控制器中删除方法

    var userInfo = await userManager.FindByIdAsync(user.Id);
    if (userInfo == null) 
    {
        return NotFound();
    }
    _ = await userManager.RemoveFromroleAsync(userInfo,userInfo.RoleName);
    _ = await userManager.DeleteAsync(userInfo);
    
    int rowsAffected = await db.SaveChangesAsync();

知道为什么这个错误没有消失,Fluent API 好吗?或者我需要输入原始 sql删除用户的应用程序,然后是用户?我看过几乎所有类似的问题,但没有一个我有用。

解决方法

好像应用表中没有配置级联删除,尝试用SSMS检查一下:

打开SQL Server 对象资源管理器(或使用服务器资源管理器),找到 SQL Server 数据库,然后右键单击 应用程序 表 -> 脚本为 -> CREATE To -> New Query Window,然后检查表是否配置了级联删除,查看这个截图:

enter image description here

为了解决这个问题,使用Fluent API映射配置级联删除后,记得开启迁移和更新数据库:

rawurlencode($video_url)

此外,您还可以通过执行以下 SQL 命令(通过 SSMS)来配置级联删除:

  Add-Migration AddCascadeDelete
  Update-Database
,

你能不能试着把它反过来设置一下;

builder.Entity<User>()
    .HasMany<Application>(u => u.Applications)
    .WillCascadeOnDelete();

或在您的代码中使用 .WillCascadeOnDelete()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。