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

时间:2011-08-23 06:44:39

标签: entity-framework entity-framework-4.1

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

到目前为止,我已成功将数据从DB获取到UserEntity,但相关的RoleEntity对象除外。我的测试用户对象的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

角色表中的数据:

Id名称

1管理员

修改

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

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

3 个答案:

答案 0 :(得分:2)

我没有看到您通过

在构造函数中禁用了代理创建
Configuration.ProxyCreationEnabled = false

禁用代理创建时,延迟加载将无效。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

Configuration.ProxyCreationEnabled = false;

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