Fluent API多对多映射错误

时间:2011-11-02 20:57:38

标签: orm entity-framework-4 mapping fluent-interface

我有以下映射来支持多对多表(User_Role)

     modelBuilder.Entity<Role>()
        .HasMany<User>(u => u.users)
        .WithMany(r => r.roles)
        .Map(m => 
           m.MapLeftKey("role_id")
           m.MapRightKey("user_id")
           m.ToTable("User_Role"));

这可以很好地将许多角色映射到用户,将许多用户映射到角色。我遇到的问题是当我需要通过实体向表User_Role添加一个新行时,如下所示:

public class User_Role
{
   [Key Column(Order=1)]   
   public int role_id {get;set;)
   [Key Column(Order=1)]
   public int user_id {get;set;)
}

每当我尝试按如下方式访问此实体时:

 dbContext.User_Role.Add(new User_Role {user_id ....

EF查找一个名为User_Role1的不存在的表...它在表名中添加了“1”。

然后我尝试添加:

  [Table("User_Role")] 

这需要添加“1”,但我现在收到此错误:

“已经定义了具有模式'dbo'和表'User_Role'的EntitySet'RoleUser'。每个EntitySet必须引用一个唯一的模式和表”

我能够确认以下几行是导致问题的,但我有点需要它们

 m.ToTable("User_Role") and public class User_Role..

任何建议都会很棒......我很难过。

1 个答案:

答案 0 :(得分:4)

您不能通过模型​​中的实体类以多对多关系表示连接表。此连接表由EF管理,您无法直接访问此表。如果要在现有用户和现有角色之间创建关系,则必须使用以下两个实体执行此操作:

var user = dbContext.Users.Single(u => u.id == user_id);
var role = dbContext.Roles.Single(r => r.id == role_id);

// if you don't have lazy loading and don't instantiate the collection
// in the constructor, add this: user.roles = new List<Role>(); 

user.roles.Add(role);

dbContext.SaveChanges();

这会将新关系((user_id,role_id)对)的条目写入连接表。

修改

如果您只有两个关键属性,并且不想从数据库加载用户和角色,则可以使用附加的“存根实体”:

var user = new User { id = user_id, roles = new List<Role>() };
var role = new Role { id = role_id };

dbContext.Users.Attach(user);
dbContext.Roles.Attach(role);

user.roles.Add(role);

dbContext.SaveChanges();