问题描述
当我尝试从 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,然后检查表是否配置了级联删除,查看这个截图:
为了解决这个问题,使用Fluent API映射配置级联删除后,记得开启迁移和更新数据库:
rawurlencode($video_url)
此外,您还可以通过执行以下 SQL 命令(通过 SSMS)来配置级联删除:
Add-Migration AddCascadeDelete
Update-Database
,
你能不能试着把它反过来设置一下;
builder.Entity<User>()
.HasMany<Application>(u => u.Applications)
.WillCascadeOnDelete();
或在您的代码中使用 .WillCascadeOnDelete()
。