【问题标题】:Why can't I delete the connection as I added it?为什么我添加的连接不能删除?
【发布时间】:2022-08-18 06:57:37
【问题描述】:

我已经在使用身份库创建的用户之间建立了多对多的关系连接。

  public class AppUser:IdentityUser
{
    public AppUser()
    {
        MainUser = new List<AppUser>();
        UserConnection = new List<AppUser>();
    }
    public ICollection<AppUser> MainUser { get; set; } 
    public ICollection<AppUser> UserConnection { get; set; }
    
}

我在基类中指定了主要用户,如下所示。

protected AppUser CurrentUser => userManager.FindByNameAsync(User.Identity.Name).Result;

当我想在用户之间添加链接时,我没有问题。

 [HttpPost]
 public IActionResult AddConnection(UserViewModel model)
{
  AppUser searchedUser = userManager.FindByNameAsync(model.UserName).Result;
  CurrentUser.UserConnection.Add(searchedUser);
  Context.SaveChanges();
  return Redirect($\"FindConnection/{model.Search}\");
}

但是我用同样的方法不能删除用户之间的连接,这是为什么呢?

[HttpPost]
public IActionResult RemoveConnection(UserViewModel model)
{
  AppUser user = Context.Users.FirstOrDefault(x => x.UserName == model.UserName);
  CurrentUser.UserConnection.Remove(user);
  Context.SaveChanges();
  return Redirect($\"FindConnection/{model.Search}\");
}

  • 做Context.Users.Include(u =&gt; u.UserConnection)。也就是说,gif 更让人分心而不是帮助。
  • 首先,感谢您的帮助,我的主要问题是为什么我们要删除它时需要UserConnection,而在添加时生成要添加的用户对象就足够了?至于 gif,我分享它是为了表明我可以添加用户但不能删除它们。

标签: asp.net-mvc entity-framework-6 asp.net-identity


【解决方案1】:

从关联中删除实体的行为将取决于父实体是否加载了这些关系引用以进行更改跟踪以检测何时删除关系。在您的情况下,假设 CurrentUser 加载了相同的 DbContext 实例:

CurrentUser = Context.Users
    .Include(x => x.UserConnection)
    .Single(x => x.UserName == currentUserName);

然后,可以通过在 CurrentUser.UserConnection 中找到关联实体并将其删除,然后调用 SaveChanges() 来简单地删除关联实体:

[HttpPost]
public IActionResult RemoveConnection(UserViewModel model)
{
    var user = CurrentUser.UserConnection.SingleOfDefault(x => x.UserName == model.UserName);
    if (user != null)
    {
        CurrentUser.UserConnection.Remove(user);
        Context.SaveChanges();
    }
    return Redirect($"FindConnection/{model.Search}");
}

如果不能指望 CurrentUser 已经预先加载了它的用户连接,那么事情会变得有点复杂。首先,我们仍然应该检查用户连接是否存在,因为即使没有显式地预先加载,如果碰巧跟踪到其中的任何一个,DbContext 也会填充亲属:

    var user = CurrentUser.UserConnection.SingleOrDefault(x => x.UserName == model.UserName);
    if (user == null)
    {
        Context.Entry(CurrentUser).Collection("UserConnection").Load();
        user = CurrentUser.UserConnection.SingleOrDefault(x => x.UserName == model.UserName);
    }
    if (user != null)
    {
        CurrentUser.UserConnection.Remove(user);
        Context.SaveChanges();
    }
    return Redirect($"FindConnection/{model.Search}");
}

本质上,检查是否存在引用。如果没有,请转到 DbContext 以确保在 CurrentUser 上加载了 UserConnection 集合并再次检查。如果存在,则将其删除,否则无事可做。 (已经删除)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多