Мне не удается найти правильную схему сопоставления для моих моделей на основе EF.

My business objects

У меня есть данный серийный номер (устройство), и я хочу создать модель представления, содержащую все соответствующие изображения с соответствующими категориями. Я только недавно добавил категории, и тут у меня начались проблемы. До этого я просто выбирал соответствующее устройство с помощью

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

А затем с помощью Automapper сопоставил свой атрибут Images со списком изображений в модели представления. Теперь я в основном хочу создать список со всеми задействованными категориями с соответствующими коллекциями связанных изображений. Однако я не могу понять, с чего начать. Что мне использовать вместо исходного устройства? Я хочу получать только категории с изображениями, относящимися к определенному устройству.

Я думаю, что мог бы понять, как сделать это в цикле (перебрать все изображения и добавить их соответствующие категории в список), но тогда я думаю, что это будет ссылаться не только на изображения, связанные с устройством, но и на все изображения относится к категории. Также у меня сложилось впечатление, что с ORM мне не нужны циклы до момента, когда я обрабатываю данные.

0
RikuXan 17 Мар 2014 в 23:47
Вы используете EF. Используйте свойства навигации, чтобы выбрать то, что вы хотите.
 – 
Sam Leach
17 Мар 2014 в 23:50

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);
-1
Sam Leach 18 Мар 2014 в 00:36
Прежде всего позвольте мне поблагодарить вас за ваши усилия. Я не уверен, правильно ли я принял ваш код, но он, по крайней мере, возвращает мне устройство, правильный список назначенных изображений и список категорий. Однако при переходе по категориям они содержат все изображения, а не только те, из которых был сделан выбор. Должен ли я смириться с этим и вручную проверять, действительно ли назначено указанное изображение, или есть трюк, чтобы отфильтровать их автоматически?
 – 
RikuXan
18 Мар 2014 в 00:46
Вот какова ваша схема базы данных. Вам придется фильтровать их вручную, если вы хотите вернуться из категории обратно в изображение.
 – 
Sam Leach
18 Мар 2014 в 01:22
В итоге я пересек атрибут изображения каждой категории с общим списком изображений. Это удалило все неназначенные изображения из списка категорий.
 – 
RikuXan
26 Мар 2014 в 13:02