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

これにより、データベースに User、Role、UserRole の 3 つのテーブルが作成されます。

汎用リポジトリを利用しています。追加と更新は次のようになります。

    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 に答える