我有以下映射来支持多对多表(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..
任何建议都会很棒......我很难过。
答案 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();