0

我有(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>();
    }
}

这将在我的数据库中创建三个表,用户、角色和用户角色。

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

    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 个新角色更新用户。

4

1 回答 1

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);
于 2013-05-09T15:43:51.713 回答