首先在实体框架代码中查询自定义类型

本文关键字:查询 自定义 类型 代码 框架 实体 | 更新日期: 2023-09-27 18:10:30

假设我有三个这样的类:

public class Employee {
  public int EmployeeId {get;set;}
  public string Fname {get;set;}
  public File Picture {get;set;}
}
public class Employer {
  public int EmployerId {get;set;}
  public string Fname {get;set;}
  public string WorkingPlace{get;set;}
  public File Pictrue {get;set;}
}
public class File {
  public int FileId {get;set;}
  public byte[] Content {get;set;}
  public int Size {get;set;}
}

首先,上面的代码是正确的方式来保存不同实体的文件和图像吗?这是我的context类:

public class MyDbContext : DbContext
{     
    public DbSet<File> Files { get; set; }
    public DbSet<Employee> Employees { get; set; }
    public DbSet<Employer> Employers { get; set; }
}

当我有这样的查询:

MyDbContext context = new MyDbContext
var q = from emp in context.Employees
        where emp.EmployeeId == 4
        select emp;
Console.WriteLine(q.First().Picture.FileId)

我得到0作为FileId,而我看到它不是0,当我在数据库中查找。q.First().Picture设置不正确

首先在实体框架代码中查询自定义类型

eager loadinglazy loading两种选择。您可以从这篇MSDN文章

获得更多有关它们的详细信息。

延迟加载通常被认为是最佳实践,因为默认情况下您应该只将需要的内容加载到内存中;然后根据每个查询进行相应的调整。

对于延迟加载,您所要做的就是将virtual添加到相关属性中:

public class Employee {
  public int EmployeeId {get;set;}
  public string Fname {get;set;}
  public virtual File Picture {get;set;}
}

这将使您的查询按预期工作;然而,它可能会导致2次数据库调用,这将是低效的。为了解决这个问题,您可以使用.Include<>

将数据作为查询的一部分快速加载。
MyDbContext context = new MyDbContext
var q = context.Employees.Include(e => e.Picture).Where(e => e.EmployeeId == 4);
var q2 = context.Employees.Include("Picture").Where(e => e.EmployeeId == 4); //Alternative syntax
Console.WriteLine(q.First().Picture.FileId)