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);

これはinserttblUserGroup テーブルに記録されます。

あなたもできるvise versaa user特定のグループに追加する場合。

myGroup.Users.Add(myUser);

しかし、本当にtblUserGroupedmx でテーブルを生成したい場合は、単に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 に答える