实体框架(一对一映射)将依赖项模型提取为 null
本文关键字:模型 提取 null 依赖 框架 一对一 映射 实体 | 更新日期: 2023-09-27 18:32:43
Table dbo.用户: 用户标识, 用户名, 电子邮件 ...
表 dbo.客户: 用户标识, 名字, 姓氏, ...
模型:
public class User
{
public long UserId { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
public Client Client { get; set; }
...
}
public class Client
{
public long UserId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
...
}
我的数据库包含:
public DbSet<User> Users { get; set; }
public DbSet<Client> Clients { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasKey(x => x.UserId)
.HasRequired(x => x.Client).WithRequiredPrincipal();
modelBuilder.Entity<Client>()
.HasKey(x => x.UserId)
.ToTable("Client");
}
结果,我有带有空客户端的用户模型。但是如果我通过相同的 UserId 获取客户端,我会看到该模型已填充。
怎么了?
编辑:
public virtual Client Client { get; set; }
是否正确定义了用户的客户端属性:
public virtual Client UserClient { get; set; }
这样做将允许 EF 生成动态代理 - 在运行时对 User 类进行子类化,并插入代码以支持客户端属性的延迟加载。Client 属性仅在请求时填充,但看起来好像它一直存在 - 通过分析数据源并检查是否发出 2 个单独的查询来验证这一点。
您还可以在DBContext子类的构造函数中检查是否打开了延迟加载。如果缺少此功能,则默认情况下为 true。
Configuration.LazyLoadingEnabled = true;
如果做不到这一点,你如何访问DBContext,你正在运行什么代码?
当然,最好禁用 LazyLoads,由您自己处理。
Configuration.LazyLoadingEnabled = false;
当你获取用户时,你应该写:
context.Users.Include("UserClient").ToList();
您还应该具有正确的属性:
public virtual Client UserClient { get; set; }