在EF中,没有表示桥表的对象。但我需要删除/添加记录到桥表,所以我想创建一个代表桥表
的类例如:
User: userID, name
Group: groupID, name
tblUserGroup: userID, groupID (bridge table)
我有以下内容:
public class EFDbContext : DbContext
{
public DbSet<User> User { get; set; }
public DbSet<Group> Group { get; set; }
public DbSet<GroupUser> tblGroupUser { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<User>().ToTable("User");
modelBuilder.Entity<Group>().ToTable("Group");
modelBuilder.Entity<GroupUser>().HasKey(a => new { a.UserID, a.GroupID });
modelBuilder.Entity<Group>()
.HasMany(u => u.User)
.WithMany(g => g.Group)
.Map(m =>
{
m.MapLeftKey("GroupID");
m.MapRightKey("NetworkUserID");
m.ToTable("tblGroupUser");
});
}
}
当我想使用桥牌表时
context.tblGroupUser...(do sth)
错误说
Invalid object name 'dbo.GroupUsers'.
我认为它说它不知道哪个表GroupUser映射到
但是当我添加
modelBuilder.Entity<GroupUser>().ToTable("tblGroupUser");
错误更改为
Each EntitySet must refer to a unique schema and table.
现在它不允许我映射tblGroupUser 2次。我该如何解决这个问题
其他信息
public class EFGroupkUser
{
private EFDbContext context = new EFDbContext();
public IQueryable<GroupUser> tblGroupUser
{
get { return context.tblGroupUser; }
}
}
答案 0 :(得分:0)
如果您的问题只是关于从联结表中添加/删除,您可以简单地执行此操作,而无需调整模型的映射:
// ...
User u = db.Users.Find(id);
foreach (var g in u.Groups.ToList())
db.tblUserGroups.Remove(g);
Collection<GroupUser> gusers = new Collection<GroupUser>();
foreach (var item in model.GroupUsers)
{
tblGroupUser guo = new tblGroupUser();
guo.UserID = item.UserID;
guo.GroupID = item.GroupID;
gusers.Add(guo);
}
u.Groups = gusers;
db.SaveChanges();
您可以像上面的代码那样执行任何想要连接表的添加/删除。如果问题就在于此,请让EF按惯例完成工作并删除OnModelCreating
答案 1 :(得分:0)
此问题可能来自此question duplicate
。
如果您想将a group
添加到特定用户。
var myUser = dbContext.Users.Find(id);
var myGroup= db.Groups.Single(group => group.GroupId == groupId);
myUser.Groups.Add(myGroup);
这将insert
记录到tblUserGroup表。
您也可以执行vise versa
。
如果您要将a user
添加到特定群组。
myGroup.Users.Add(myUser);
但是如果你真的希望在edmx中生成tblUserGroup
表,只需add an aditional column
(让我们说IsActive)到tblUserGroup
表,然后更新edmx。现在您可以使用tblUserGroup类。