2012-08-24 44 views
0

我花了一天的时间解决了这个问题。有这些entitites:实体代码第一多对多关系保存

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 
} 

的用户角色和登录权限已在数据库中。所以我尝试添加特权登录到用户角色。 但是关系不会保存在数据库中 - RolesPrivilegesMapping表不包含记录,其id与用户角色和登录权限相对应。 如果我干脆直接添加 - 它的工作原理,但它不是我的目标:

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

谁能指点我如何只添加许多一对多的关系,如果在数据库中存在的所有实体? 我使用EF 5.0。我已经用EF 4.3试过了,结果相同。

回答

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(); 
     } 
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; 
相关问题