asp.net-访问多对多关系属性

时间:2019-12-30 14:19:32

标签: c# ssms relationship

我正在做一个练习,其中一部分需要我做一个将用户角色从User更改为subbed user的按钮。我使用的表是Roles (Id, Title)Users (Id, name, etc, ),它们通过多对多关系连接,因此我尝试使用行u.Roles.FirstOrDefault().Title访问每个用户的属性标题,如下所示:如下:

public void ChangeRoleFromUserToSubscribedUser(User u)
{
    u.Roles.FirstOrDefault().Title = "Subscribed User";

    Entity.SaveChanges();
}

和获取用户的then方法:

public ActionResult Change(string email)
{
    UsersRepository ur = new UsersRepository();
    var user = ur.GetUser().SingleOrDefault(x => x.Email == email);

    ur.ChangeRoleFromUserToSubscribedUser(user);
    return RedirectToAction("List");
}

现在,我尝试更改某个用户的名称(我们称他为bob),并且可以使用,但是,当我使用上面的代码时,当我按下按钮时,Bob的角色不会从{{ 1}}至User。相反,表Subscribed user中的标题从Roles变为User

我在做什么错了?

2 个答案:

答案 0 :(得分:1)

您可以尝试这种方式

public void ChangeRoleFromUserToSubscribedUser(User u)
{
    var role = u.Roles.FirstOrDefault();
    role.Title = "Subscribed User";
    Entity.Entry(role).State = EntityState.Modified;

    Entity.SaveChanges();
}

已更新

您需要更新UserRoles而不是Roles表。

答案 1 :(得分:0)

以下一行

u.Roles.FirstOrDefault().Title = "Subscribed User";

选择分配给用户的角色对象,然后将角色标题更改为“已订阅用户”。具体来说,您正在将标题为“用户”的角色更改为“订阅用户”,这不是您想要的。

您要按如下所示将用户的角色设置为现有实体对象(我假设存在一个未定义的RoleRepository):

var newRole= new RoleRepository().GetRole("Subscribed User");
var oldRole = u.Roles.First(x => x.Title == "User");
u.Roles.Remove(oldRole);
u.Roles.Add(newRole);