实体框架获取数据时有很多问题

时间:2013-01-11 15:36:05

标签: entity-framework entity-framework-4 many-to-many

我有两个简单的类

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.我不知道为什么会发生这种情况

1 个答案:

答案 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.