EF4 и MVC3 отображают ViewModel в сущности - PullRequest
0 голосов
/ 04 марта 2011

У меня есть рабочая группа EF4 Entity. Ниже приведены метаданные для этой модели для справки.

    [MetadataType(typeof(WorkgroupMetaData))]
public partial class Workgroup {
    public Contact manager { get; set; }
}

[Bind(Exclude = "id")]
public class WorkgroupMetaData
{
    [ScaffoldColumn(false)]
    public int id { get; set; }

    [DisplayName("Org. Number")]
    [Required(ErrorMessage = "Org. Number is required.")]
    public string org_number { get; set; }

    [DisplayName("Workgroup Name")]
    [Required(ErrorMessage = "Workgroup name is required.")]
    public string name { get; set; }

    [DisplayName("Customer Contact")]
    public int customer_contact_id { get; set; }

    [DisplayName("Manager")]
    public int manager_id { get; set; }

    [DisplayName("Tech. Lead")]
    public int lead_id { get; set; }

    [DisplayName("Time Approver")]
    public int time_approver { get; set; }

    [DisplayName("Description")]
    public string description { get; set; }

    [ScaffoldColumn(false)]
    public object created_at { get; set; }

    [ScaffoldColumn(false)]
    public object last_modified_at { get; set; }
}

У меня есть ViewModel, определенная как:

    public class WorkgroupViewModel
{
    public Workgroup Workgroup { get; set; }
    public List<Workgroup> Workgroups { get; set; }
}

В представлении у меня есть сетка для выгрузки доступных рабочих групп. Это работает, но мне было интересно, как преобразовать поля идентификатора в фактические строки из другой таблицы. По сути, manager, customer_contact, lead - это все ссылки на сущность Contact. Я хотел бы показать имена из контактов, а не только идентификатор.

Как это можно сделать? Я немного огляделся, но не могу найти предложение или ответ. Может быть, я смотрю на это с неправильной точки зрения?

1 Ответ

1 голос
/ 04 марта 2011

Возможно, вы захотите использовать оболочку для Workgroup (шаблон декоратора) или Tuple или создать собственный класс, который связывает их вместе.

public class WorkgroupDisplayModel
{
    public Workgroup Workgroup { get; set; }
    public Manager Manager { get; set; }
    // Add additional properties for each related type
}

В своем запросе EF вы можете сделать что-то вроде:

var query = from w in Context.Workgroups
            join m in Context.Managers
                on w.manager_id equals m.uid
            // Additional joins for each related table
            where w.Description == "Project 1" // Whatever criteria
            select Tuple.Create(w, m); // Add param for each type
            //or
            //select new WorkgroupDisplayModel { Workgroup = w, Manager = m, ... };
var list = query.ToList();
var contact = list[0].Item1; // Tuple has strongly typed Item1 thru ItemN
var manager = list[0].Item2;

Тогда модель вашего представления может иметь:

List<Tuple<Workgroup, Manager, Customer, Lead>> Workgroups { get; set; }

или

List<WorkgroupDisplayModel> Workgroups { get; set; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...