如何使用Entity Framework的导航属性来构建视图模型

时间:2014-03-17 19:47:18

标签: linq entity-framework orm

我无法为基于EF的模型找到正确的映射架构。

My business objects

我有一个给定的序列(设备),我想创建一个包含所有相关图像及其各自类别的视图模型。我最近才添加了类别,这就是我的问题开始的地方。直到那时我才用

选择相关设备

dbCon.Devices.SingleOrDefault(d => d.serial == serial)

然后,使用Automapper将其Images属性映射到视图模型中的图像列表。现在我基本上想要创建一个包含所有相关类别的列表,以及相关图像的相应集合。但是我无法弄清楚如何开始。我用什么代替我的初始设备?我只想接收包含与已定义设备相关的图像的类别。

我想我可以弄清楚如何在循环中完成它(循环遍历所有图像并将它们各自的类别添加到列表中),但是我认为它不仅会链接到与设备相关的图像,而且所有与该类别相关的图像。另外我的印象是,使用ORM我不需要循环,直到我处理数据。

1 个答案:

答案 0 :(得分:-1)

  

我有一个给定的序列(设备),我想创建一个视图模型   包含所有相关图像及其各自的类别。

使用导航属性:

// Get Device
Device device = dbCon.Devices.SingleOrDefault(d => d.serial == serial);

// Get Device's Images
IQueryable<Image> images = device.Images;

// Get Images Categories
IQueryable<Category> categories = images.Select(c => c.Category);

您的视图模型看起来像:

class DeviceImageCategoriesViewModel
{
    Device Device { get; set; }
    List<Category> Categories { get; set; }
}

var viewModel = new DeviceImageCategoriesViewModel
{
    Device = device,
    Categories = categories.ToList() // Each Category will have its navigation property back to Images
};

或者使用预先加载:

Device device = dbCon.Devices.SingleOrDefault(d => d.serial == serial) 
                             .Include(i => i.Images.Select(c => c.Categories)) 
                             .ToList(); 

List<Category> categories = device.Images.Select(c => c.Categories);