MVC EF映射多对多关系表

时间:2013-08-07 20:32:42

标签: asp.net-mvc entity-framework many-to-many

在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; }
            }
        }

2 个答案:

答案 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类。