提问人:Damo 提问时间:6/1/2014 最后编辑:andypDamo 更新时间:6/1/2014 访问量:20674
实体框架,代码优先。子对象在调用时未填充
Entity framework, code first. Child objects not populating when called
问:
我首先要掌握 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 自动引用 ,或者就此而言。但我怀疑,一旦我们解决了一个问题,它就会解决另一个问题。Cars
Coordinates
Coordinates
Client
我做错了什么,我是否误解了该怎么做?
答:
3赞
yar_shukan
6/1/2014
#1
没有的原因是查询中不包含它。有多种方法可以将其包含在结果中:Coordinates
_context.Cars.Include(car => car.Coordinates).ToList();
---它将在一次查询中获取带有坐标的汽车- 如果你不需要所有的汽车,你可以执行以下操作:使属性虚拟化,然后当你获得汽车时,如果需要,你可以只获取其中的子集,并且将对数据库进行单独的调用,以获得每个属性的“获取”访问权限。你还将在调试器中看到 EF 为你创建了动态类,因此这就是为什么你必须让它
另请参阅此答案以获取更多详细信息。Coordinates
Coordinates
Coordinates
virtual
40赞
andyp
6/1/2014
#2
您在这里有几个选择:
通过告诉 EF Include() 来急切地加载相关实体。例如,您可以加载包括他们的 和 如下所示:
Cars
Coordinates
Clients
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;
评论