3

表 dbo.Users:用户 ID 、用户名、电子邮件、...

表 dbo.Client: 用户 ID、名字、姓氏、...

楷模:

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

我的 DBContents 包含:

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 获取 Client,我会看到该模型已填充。

怎么了?

编辑:

public virtual Client Client { get; set; }
4

2 回答 2

3

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

public virtual Client UserClient { get; set; }

这样做将允许 EF 生成动态代理 - 在运行时子类化您的 User 类并插入代码以支持客户端属性的延迟加载。Client 属性仅在被请求时才会被填充,但看起来好像它一直存在 - 通过分析您的数据源并检查发出 2 个单独的查询来验证这一点。

您还可以在 DBContext 子类的构造函数中检查是否打开了延迟加载。如果缺少此项,则默认情况下为 true。

Configuration.LazyLoadingEnabled = true;

如果失败了,您将如何访问 DBContext,您正在运行什么代码?

于 2013-09-24T08:43:01.807 回答
2

当然最好禁用 LazyLoadings 并由您自己处理。

Configuration.LazyLoadingEnabled = false;

当您获取用户时,您应该编写:

context.Users.Include("UserClient").ToList();

你也应该有正确的属性:

public virtual Client UserClient { get; set; }
于 2013-09-24T11:47:50.813 回答