在ASP.NET MVC中,如何同步或组合两个不同类型的集合

时间:2010-12-14 09:10:15

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

我有两个集合,OrderItems和Items。有两个原因是因为在我的模型中我有一个固定的Item,以及一个与Item相关的OrderItem,并添加了与订单对象相关的数量和属性(OrderID)等订单特定信息。

在Entity Framework 4中,为了在模型中拥有对象集合,您需要在集合类型的对象中与该模型相关联。这使得Item中的OrderID属性成为必需。

以下是代码中的POCO:

public class Order {
    public int OrderID { get; set; }
    public DateTime DatePlaced { get; set; }
    public bool Filled { get; set; }
    public string Comment { get; set; }

    public virtual ICollection<OrderItem> OrderItems { get; set; }
}

public class OrderItem {
    public int OrderItemID { get; set; }
    public int OrderID { get; set; }
    public int Quantity { get; set; }
    public int ItemID { get; set; }
}

public class Item {
    public int ItemID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public int Size { get; set; }
}

所以现在我有我的模型,我想显示订单详情页面。我可以从控制器发送订单到ViewModel(MVC 3)或ViewData(MVC 2/1)工作正常,我也可以发送一个Item的集合,但是如何显示包含的项目列表Item属性和OrderItem中的数量?由于两者都是集合,我可以在视图中同时使用OrderBy ItemID和循环,但这看起来非常混乱。

我在创建一个将项目和订单结合在一起的匿名类,但在组合集合时却没有真正起作用。

我基本上想循环遍历每个Item和OrderItem并显示以下属性,而不在视图中执行:

名称
说明
大小
数量

想法?

2 个答案:

答案 0 :(得分:1)

我相信,如果我错了,请原谅我,但是使用EntityFramework(假设代码优先,但我认为db首先你仍然可以做到),你可以设置以下内容:

public class OrderItem {
    public int OrderItemID { get; set; }
    public int OrderID { get; set; }
    public int Quantity { get; set; }
    public virtual Item Item { get; set; }
}

然后当你引用Item.Name等时,它将懒洋洋地加载数据。我目前无权访问。

希望这会有所帮助,或者至少引导你朝着正确的方向前进。

修改

考虑一下,我相信如果你先做db,那么只要你已经在数据库中定义了关系,那么你应该能够通过关系属性从OrderItem访问相关的Item。

答案 1 :(得分:1)

Item不应该来自OrderItem而你只显示Item,其中包含OrderItem的所有信息以及更多信息吗?

因此,您只能从数据库中获取项目并使用模板显示...

public class OrderItem {
    public int OrderItemID { get; set; }
    public int OrderID { get; set; }
    public int Quantity { get; set; }
    public int ItemID { get; set; }
}

public class Item : OrderItem {
    // public int ItemID { get; set; } not anymore needed
    public string Name { get; set; }
    public string Description { get; set; }
    public int Size { get; set; }
}