实体框架,代码优先。子对象在调用时未填充

Entity framework, code first. Child objects not populating when called

提问人:Damo 提问时间:6/1/2014 最后编辑:andypDamo 更新时间:6/1/2014 访问量:20674

问:

我首先要掌握 EF 代码。当我在代码中调用对象时,我的域模型设计似乎不支持对象的自动“填充”子项。

型:

public class Car
{
    [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required,MaxLength(10)]
    public string Registration { get; set; }

    [MaxLength(30)]
    public string Make { get; set; }

    [MaxLength(45)]
    public string Model { get; set; }

    [Required]
    public Coordinates Coordinates { get; set; }

    [Required]
    public Client Client { get; set; }                    
}

public class Coordinates
{
    [Key, ForeignKey("Car")]
    public int Id { get; set; }

    public double Latitude { get; set; }

    public double Longitude { get; set; }

    [Required]
    public Car Car { get; set; }
}

例如,我只需调用:

public List<Car> Get()
{            
    var cars = _context.Cars.ToList();
    return cars;
}

我的对象包含数据库中的所有内容,但不包括 .数据库种子正确创建了数据,但我无法让 EF 自动引用 ,或者就此而言。但我怀疑,一旦我们解决了一个问题,它就会解决另一个问题。CarsCoordinatesCoordinatesClient

我做错了什么,我是否误解了该怎么做?

C# 实体框架 EF-代码优先

评论


答:

3赞 yar_shukan 6/1/2014 #1

没有的原因是查询中不包含它。有多种方法可以将其包含在结果中:Coordinates

  1. _context.Cars.Include(car => car.Coordinates).ToList();---它将在一次查询中获取带有坐标的汽车
  2. 如果你不需要所有的汽车,你可以执行以下操作:使属性虚拟化,然后当你获得汽车时,如果需要,你可以只获取其中的子集,并且将对数据库进行单独的调用,以获得每个属性的“获取”访问权限。你还将在调试器中看到 EF 为你创建了动态类,因此这就是为什么你必须让它
    另请参阅此答案以获取更多详细信息。
    CoordinatesCoordinatesCoordinatesvirtual
40赞 andyp 6/1/2014 #2

您在这里有几个选择:

  • 通过告诉 EF Include() 来急切地加载相关实体。例如,您可以加载包括他们的 和 如下所示:CarsCoordinatesClients

    public List<Car> Get()
    {            
        var cars = _context.Cars
            .Include(car => car.Coordinates)
            .Include(car => car.Client)
            .ToList();
        return cars;
    }
    
  • 通过声明导航属性来延迟加载相关实体,从而告诉 EF 在首次访问时加载它们。确保您没有为上下文禁用延迟加载,如下所示:virtual

    this.Configuration.LazyLoadingEnabled = false;

一个简短的示例如下所示:

public class Car
{
    // ... the other properties like in your class definition above

    public virtual Coordinates Coordinates { get; set;}
}

public void Get()
{
    var cars = _context.Cars.ToList();
    var coordinates = cars.First().Coordinates; // EF loads the Coordinates of the first car NOW!
}
  • 将相关实体显式加载到上下文中。然后,上下文将为您填充导航属性。看起来像这样:

    public List<Car> Get()
    {
        // get all cars
        var cars = _context.Cars.ToList();
    
        // get all coordinates: the context will populate the Coordinates 
        // property on the cars loaded above
        var coordinates = _context.Coordinates.ToList();
        return cars;
    }
    

评论

2赞 sky91 3/22/2017
如果在using System.Data.Entity;.Include(car => car.Coordinates)
0赞 open-collar 10/27/2020
@sky91 - 添加到类的顶部。using Microsoft.EntityFrameworkCore;