我正在使用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;
答案 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;
当然,即使禁用代理创建,也必须能够使用关系,所以如果有人有任何其他信息,我想听听。但就目前而言,我很高兴问题得到了解决。