实体框架6代码首先查找表未填充

时间:2016-03-24 01:20:47

标签: c# asp.net-mvc entity-framework entity-framework-6

public class Profile
{
    public int Id { get; set; }
    //...
    public virtual List<Room> Rooms { get; set; }
}

public class Room
{
    public int Id { get; set; }
    //...
    public virtual List<Profile> Members { get; set; }
}

public void AddUserToRoom(Profile user, Room room)
{
    room.Members.Add(user);
    user.Rooms.Add(room);
    _DBContext.SaveChanges();
}

enter image description here

上面的代码生成了显示的模式,但是表格ProfileRooms在SaveChanges()之后没有填充ProfileRooms表。然后,如果之后查询,则列表为空。有人抓住了我为多对多映射做错的事情? AddUserToRoom位于一个管理器类中,该类保存数据库上下文的范围直到dispose,因此在调用时上下文仍在范围内。我还覆盖了Profile和Room的Equals(),并检查ID是否相等。

  • .NET 4.5
  • MVC 5项目
  • IDE VS 2013

我显然错过了一些东西。提前谢谢!

- Updated-- 对不起,遗漏了流畅的api电话,这可能就是故障所在:

modelBuilder.Entity<Room>()
    .HasMany(e => e.Members)
    .WithMany(a => a.Rooms)
    .Map(mc =>
    {
        mc.ToTable("RoomMembers");
        mc.MapLeftKey("RoomId");
        mc.MapRightKey("MemberId");
    });

modelBuilder.Entity<Profile>()
    .HasMany(e => e.Rooms)
    .WithMany(a => a.Members)
    .Map(mc =>
    {
        mc.ToTable("RoomMembers");
        mc.MapLeftKey("MemberId");
        mc.MapRightKey("RoomId");
    });

1 个答案:

答案 0 :(得分:0)

解决方案

从经理中的不同dbcontext检索房间。有一个静态函数来检索房间,然后将其传回,并使用实例dbcontext来保存更改。自静态方法编写以来我已经忘记了它已经有一段时间了。有趣的是没有任何错误,它只是通过它没有任何变化。当我使用传入房间中的id从类实例上下文中检索它时,它可以工作。

- 互联网搜索者的其他信息 -

我从集合中删除了virtual关键字,并添加了一个名为:

的调用
_DbContext.Entry(room).Collection("Members").Load();

删除连接表中的项目之前。