实体框架(一对一映射)将依赖项模型提取为 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; }

实体框架(一对一映射)将依赖项模型提取为 null

是否正确定义了用户的客户端属性:

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; }