0

私はこの問題で一日を過ごしました。これらのエンティティがあります:

public class UserRole
{
    [Key]
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual ICollection<Privilege> Privileges { get; set; }
}

public class Privilege
{
    [Key]
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual ICollection<UserRole> Roles { get; set; }
}

そして、コンテキスト内のこの構成:

modelBuilder.Entity<UserRole>().HasMany<Privilege>(a => a.Privileges).WithMany(a => a.Roles)
.Map(m =>
    {
        m.MapLeftKey("RoleId");
        m.MapRightKey("PrivilegeId");
        m.ToTable("RolesPrivilegesMapping");
    });

そして、このテストコード:

UserRole role;
//get role entity from context
//write privileges count
using (VaultContext context = new VaultContext(connectionString))
{
    role = context.UserRoles.Where(a => a.Name == "Users").FirstOrDefault();
    Console.WriteLine(role.Privileges.Count.ToString()); //writes 0
}

//make offline changes
//the privilege already exists in database
role.Privileges.Add(new Privilege() { Id = 1, Name = "Login" });

//save changes to database
using (VaultContext context = new VaultContext(connectionString))
{
    List<Privilege> privileges = new List<Privilege>();
    foreach (Privilege p in role.Privileges)
    { privileges.Add(p); }
    foreach (Privilege p in privileges)
    { context.Privileges.Attach(p); }
    role.Privileges.Clear();
    context.UserRoles.Attach(role);
    context.Entry(role).State = System.Data.EntityState.Modified;
    foreach (Privilege p in privileges)
    { role.Privileges.Add(context.Privileges.Find(p.Id)); }
    context.SaveChanges();
}

//reload the role entity
//write privileges count
using (VaultContext context = new VaultContext(connectionString))
{
    Console.WriteLine(context.UserRoles.Where(a => a.Name == "Users").FirstOrDefault().Privileges.Count.ToString()); //writes 0
}

ユーザー ロールとログイン権限は、既にデータベースに存在します。そこで、Users ロールに特権ログインを追加しようとしました。ただし、関係はデータベースに保存されません。RolesPrivilegesMapping テーブルには、Users ロールとログイン権限に対応する ID を持つレコードが含まれていません。単純に直接追加すると機能しますが、それは私のターゲットではありません:

new UserRole() 
{ 
    Name = "Administrators", 
    Privileges = new List<Privilege>() 
    { 
        new Privilege() { Name = "Login" }
    }
}

すべてのエンティティがデータベースに存在する場合、多対多の関係のみを追加する方法を教えてもらえますか? 私はEF5.0を使用しています。EF 4.3 で試してみましたが、同じ結果が得られました。

4

2 に答える 2

0

ありがとうございました。これが私の解決策です:(役割はオフラインに変更されます)

UserRole dbRole = context.UserRoles.Find(role.Id);
dbRole.Privileges.Clear();
foreach (Privilege p in role.Privileges)
{
    dbRole.Privileges.Add(context.Privileges.Find(p.Id));
}
context.Entry(dbRole).State = System.Data.EntityState.Modified;
于 2012-08-28T10:45:02.903 に答える
0

データベースに既存のエントリを追加するだけなら、もう少し簡単にできますか?

  using( VaultContext context = new VaultContext( ) )
         {
            role = context.UserRoles.FirstOrDefault(a => a.Name == "Users");
            Privilege p = context.Privileges.FirstOrDefault(pr => pr.Name == "Login");
            role.Privileges.Add(p);
            context.SaveChanges();
         }
于 2012-08-25T16:40:08.973 に答える