更新具有多对多关系的实体框架实体

时间:2013-05-09 15:38:21

标签: entity-framework code-first

我有(2)个实体,它们如下:

[Table("User")]
public class User
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    [Required]
    [MaxLength(20)]
    public string Name { get; set; }
    public ICollection<Role> Roles { get; set; }

    public User()
    {
        this.Roles = new Collection<Role>();
    }
}


[Table("User")]
public class Role
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int RoleId{ get; set; }
    [Required]
    [MaxLength(20)]
    public string Name { get; set; }
    public ICollection<User> Users { get; set; }

    public Role()
    {
        this.Users = new Collection<User>();
    }
}

这会在我的数据库中创建三个表:User,Role和UserRole。

我正在利用通用存储库,我的添加和更新如下所示:

    public virtual void Add(TEntity entity)
    {
        _dbSet.Add(entity);
    }

    public virtual void Update(TEntity entity)
    {
        _dbSet.Attach(entity);
        _dbContext.Entry(entity).State = EntityState.Modified;
    }

如果我想添加一个带角色的新用户,我必须在我的UserRepository中执行以下操作,该用户存储库继承自我的通用存储库。

    public override void Add(User entity)
    {
        foreach (var role in entity.Roles)
            _dbContext.Roles.Attach(role);

        base.Add(entity);
    }

这看起来很笨重,但确实有效。

现在我的麻烦就是当我想要更新用户时,比如添加一个新角色。我以为我可以做类似的事情。

    public override void Update(User entity)
    {
        foreach (var role in entity.Roles)
            _dbContext.Roles.Attach(role);

        base.Update(entity);
    }

但这不起作用......任何关于我做错事的想法都会受到赞赏!

更新

我的用例是我有一个X角色的现有用户,我添加了Y个角色,我想用Y个新角色更新用户。

1 个答案:

答案 0 :(得分:0)

你不应该这样做。如果该角色尚不存在,您可以执行以下操作:

var user = new User { Name="Fred" }
user.Roles.Add(new Role { Name="Accounting" });

context.Add(user);

如果您要添加现有角色,则需要先获得该角色

var role = context.Roles.Single(x => x.Name="Accounting");

var user = new User { Name="Fred" }
user.Roles.Add(role);

context.Add(user);