ASP.NET MVC5 EF6:给定多重性约束,相应的“User_AppUser_Target”也必须处于“已删除”状

本文关键字:NET Target 已删除 删除 AppUser MVC5 多重性 约束 User ASP EF6 | 更新日期: 2023-09-27 18:36:42

我有一个使用标识 2 和实体框架 6 以及存储库模式的 MVC5 项目,即重新开发旧的经典 asp 系统。我从标识 1 开始了这个项目,之后在 v2 中,他们引入了 ApplicationUser 主键可以是任何东西,而不仅仅是 GUID。

但是,我已经将应用程序用户(AspNetUsers 表)作为 1:1 关系映射到旧项目中的现有用户表(尽可能多地 EF)。这真的是1:1,这是必要的,因为我的旧表有很多很多字段。

当我尝试删除用户及其关联的应用程序用户时,出现以下错误:

来自"User_AppUser"关联集的关系位于 "已删除"状态。给定多重性约束,相应的 "User_AppUser_Target"也必须处于"已删除"状态。

这是应用程序用户:

    public class ApplicationUser : IdentityUser
    {
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
        {                
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);             
            return userIdentity;
        }
        public virtual User User { get; set; }
    }

这是用户

public class User : BaseModel
{        
    // The new identity system has a Guid as Id that is different to the UserId, So on the AspNetUser table there is new UserId field mapped.
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }    
    public virtual ApplicationUser AppUser { get; set; }      
    public string UserLogin { get { return AppUser.UserName; } }
    public string UserPass { get { return AppUser.PasswordHash; } }
    public string EmailAddress { get { return AppUser.Email; } }
    //.....ETC ....//
}

这是映射:

modelBuilder.Entity<User>()                
            .HasRequired(e => e.AppUser)                
            .WithRequiredPrincipal(e => e.User)
            .Map(c=>c.MapKey("UserId"))
            .WillCascadeOnDelete(true);

这是应用程序用户表(AspNetUser)我有一个到 User 表的外键映射:

  1. Id nvarchar(128)
  2. 用户名变量图(256) 等
  3. UserId int - 映射到用户表:UserId int

这是删除代码:

[HttpPost, ValidateAntiForgeryToken]
public async Task<ActionResult> Delete([Bind(Include="Id")] UserSaveViewModel viewModel)
{            
    ApplicationUser appUser = UserManager.FindById(viewModel.Id);                        
    await UserManager.DeleteAsync(appUser);                        
    return RedirectToAction("Index", new { isUserDeleted = true });
}

我也尝试过这个而不是UserManager.DeleteAsync()

var user = appUser.User;
await _repository.DeleteAsync<User>(user); //using the repository pattern

但这会产生此错误:

无法删除该对象,因为在 对象状态管理器。

如何正确级联删除?

ASP.NET MVC5 EF6:给定多重性约束,相应的“User_AppUser_Target”也必须处于“已删除”状

您不能以这种方式映射 1:1 关系。 EF 支持 1:1 映射的唯一方法是使用共享主键,这意味着两个表必须具有相同的键,并且一个表必须是另一个表的外键。

这很不幸,但它是 EF 不支持唯一约束时的遗留问题,如果不使用唯一约束,就无法在没有共享主键的情况下进行 1:1 映射。 当 EF 6.1 添加唯一索引支持时,内部逻辑从未更新为完全支持 1:1 方案。