首页 文章

实体框架4.1中的一对多关系:检索外部ID,但对象本身不是

提问于
浏览
0

我正在使用Entity Framework 4.1并尝试创建一对多关系 . 在我的软件中,我有UserEntity和RoleEntity类 . 每个用户都有一个角色,但一个角色可以拥有多个用户 .

到目前为止,除了相关的RoleEntity对象之外,我已成功将数据从DB获取到UserEntity . 我的测试用户对象的RoleId属性具有正确的RoleID,但Role属性为null .

在使用正确的RoleEntity填充Role属性之前,是否需要编写某种其他配置?

[Table("Roles")]
public class RoleEntity
{
    public long Id { get; set; }
    public string Name { get; set; }
}

[Table("Users")]
public class UserEntity
{
    public long Id { get; set; }
    public string Password { get; set; }
    public Int32 IsActive { get; set; }

    public string Username { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string LocalService { get; set; }

    [ForeignKey("RoleEntity")]
    public long RoleId { get; set; }

    public virtual RoleEntity Role { get; set; }
    public virtual ClientOrganizationEntity ClientOrganization { get; set; }
}

public class UserContext : DbContext
{
    #region Constructor

    public UserContext(DbConfigurationProvider dbConfigurationProvider)
        : base(dbConfigurationProvider.ConnectionString)
    {
        if (dbConfigurationProvider == null)
            throw new ArgumentNullException("dbConfigurationProvider");

        Configuration.ProxyCreationEnabled = false;
    }

    #endregion

    #region DbSets

    public DbSet<UserEntity> Users { get; set; }
    public DbSet<RoleEntity> Roles { get; set; }
    public DbSet<ClientOrganizationEntity> ClientOrganizations { get; set; }

    #endregion
}

用户表中的数据:

Id用户密码FirstName LastName电子邮件LocalService IsActive RoleId ClientOrganizationId

1 foo 62cdb7020ff920e5aa642c3d4066950dd1f01f4d FirstName LastName te@s.t foobar.com 1 1 1

角色表中的数据:

身份名称

1管理员

EDIT:

这是我如何从DbContext获取数据:

var user = _dbContext.Users.FirstOrDefault(x => x.Id == 1);
var role = user.Role;

3 回答

  • 0

    我没有看到你在构造函数中禁用了代理创建

    Configuration.ProxyCreationEnabled = false
    

    禁用代理创建时,延迟加载将不起作用 .

    因此,要么启用代理创建,要么使用 Include 方法来急切加载导航属性

    var user = _dbContext.Users.Include(u => u.Role).FirstOrDefault(x => x.Id == 1);
    
  • 0

    您需要在 UserContext 构造函数中启用延迟加载 Configuration.LazyLoadingEnabled=true; .

  • 2

    我最终解决了这个问题 . 对于一些禁用Configuration.ProxyCreationEnabled打破了关系 . 我修复它的唯一更改是删除此行:

    Configuration.ProxyCreationEnabled = false;
    

    当然,即使禁用代理创建,也必须能够使用关系,所以如果有人有任何其他信息,我想听听它 . 但就目前而言,我很高兴问题得到了解决 .

相关问题