0

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

2 回答 2

0

这个问题可能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);

但是如果你真的想tblUserGroup在 edmx 中生成表,只需add an aditional column(假设是 IsActive)到tblUserGroup表中,然后更新 edmx。现在您可以使用 tblUserGroup 类。

于 2013-08-08T09:34:04.187 回答
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

于 2013-08-08T08:28:46.097 回答