我有(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个新角色更新用户。
答案 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);