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();
}
上面的代码生成了显示的架构,但是表 ProfileRooms 并没有在 SaveChanges() 之后填充 ProfileRooms 表。然后如果之后查询列表是空白的。有人发现我在多对多映射方面做错了吗? AddUserToRoom 位于一个管理器类中,该类在处理之前保持数据库上下文的范围,因此在调用时上下文仍在范围内。我还覆盖了 Profile 和 Room 的 Equals() 并检查 ID 是否相等。
- .NET 4.5
- MVC 5 项目
- IDE 与 2013
我显然遗漏了一些东西。提前致谢!
--更新-- 抱歉,遗漏了流畅的 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");
});
最佳答案
解决方案
房间是从管理器中的不同 dbcontext 中检索到的。有一个检索房间的静态函数,然后将其传回并使用实例 dbcontext 来保存更改。自从编写静态方法以来已经有一段时间了,我已经忘记了它。有趣的是没有错误,它只是经历了它而没有任何变化。当我使用传入房间的 id 从类实例上下文中检索它时,它起作用了。
--互联网搜索者的附加信息--
我从集合中删除了 virtual
关键字,还添加了对 like 的调用:
_DbContext.Entry(room).Collection("Members").Load();
在删除连接表中的项目之前。
关于c# - Entity Framework 6 Code First 查找表未填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36191666/