【问题标题】:EF4 and MVC3 mapping ViewModels to EntitiesEF4 和 MVC3 将 ViewModel 映射到实体
【发布时间】:2011-03-03 23:23:46
【问题描述】:

我有一个 EF4 实体工作组。以下是该模型的元数据以供参考。

    [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; }
}

在视图中,我有一个网格来转储可用的工作组。这可行,但我想知道如何将 ID 字段转换为另一个表中的实际字符串。基本上,经理、customer_contact、lead 都是对 Contact 实体的引用。我想显示联系人中的姓名,而不仅仅是 id。

如何做到这一点?我环顾四周,但似乎找不到建议或答案。也许我从错误的角度看待这个问题?

【问题讨论】:

  • 查找 AutoMapper 看看它是否对您有帮助。

标签: c# entity-framework-4 asp.net-mvc-3


【解决方案1】:

您可以考虑使用 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; }

【讨论】:

  • 哦...除了实际类型,您还可以使用 Manager、Customer 等字符串。然后查询语法将是:select Tuple.Create(w, m.Name, c.LastFirst, l.DomainName) 或类似...
猜你喜欢
  • 2019-04-08
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
相关资源
最近更新 更多