我有两个简单的类
public class User
{
public User()
{
Roles = new Collection<Role>();
}
public int UserId { get; set; }
public string UserName { get; set; }
public ICollection<Role> Roles { get; set; }
}
public class Role
{
public Role()
{
Users = new Collection<User>();
}
public int RoleId { get; set; }
public string RoleName { get; set; }
public ICollection<User> Users { get; set; }
}
我通过覆盖种子方法
将其与以下数据一起播种 var firstUser = new User {UserName = "vivekr"};
var secondUser = new User {UserName = "vivekm"};
var firstRole = new Role {RoleName = "admin"};
var secondRole = new Role {RoleName = "user"};
firstUser.Roles.Add(firstRole);
firstUser.Roles.Add(secondRole);
secondUser.Roles.Add(firstRole);
context.Users.Add(firstUser);
context.Users.Add(secondUser);
通过覆盖OnModelCreating()
完成映射protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasMany<Role>(r=> r.Roles)
.WithMany(u => u.Users)
.Map(c=>
{
c.MapLeftKey("UserId");
c.MapRightKey("RoleId");
c.ToTable("UserRoles");
});
}
正确创建所有表,我可以看到值是正确的(包括映射)
但是我在获取数据时遇到了问题
如果我这样做(假设db是我的Context类的一个实例)
var selectedRoles = db.Users.Find(1).Roles;
我将selectedRoles的数量设为0.它应该是2.我不知道为什么会发生这种情况
答案 0 :(得分:0)
您需要使用Include()。当您使用include时,您不能再使用find了。尝试这样的事情:
db.Users.Include(“Roles”).FirstOrDefault(x =&gt; x.UserId == 1).Roles;
实体框架不会自动为您加载相关对象。你必须通过像上面那样热切地提取或使用延迟加载来告诉它这样做。
Here is a good article that explains different techniques for pulling in related data.