2010-12-14 55 views
0

J'ai deux collections, OrderItems et Items. La raison en est que dans mon modèle j'ai un Item qui est fixe, et un OrderItem qui se rapporte à un Item et ajoute des informations spécifiques à l'ordre telles que la quantité et une propriété (OrderID) qui renvoie à mon objet Order.Dans ASP.NET MVC, Comment synchroniser ou combiner deux collections de types différents

Dans Entity Framework 4, pour disposer d'une collection d'objets dans un modèle, vous devez vous reconnecter à ce modèle dans l'objet du type de collection. Cela rend la propriété OrderID dans Item nécessaire.

Voici le POCO est dans le code: Alors maintenant

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

J'ai mes modèles, et je veux afficher une page Détails de la commande. Je peux envoyer l'ordre à ViewModel (MVC 3) ou ViewData (MVC 2/1) à partir du contrôleur qui fonctionne bien, et je peux également envoyer une collection de Item, mais comment afficher une liste d'éléments qui contiennent à la fois les propriétés de l'objet et la quantité de l'OrderItem? Puisque les deux sont des collections, je pourrais OrderBy ItemID et faire un looping en même temps dans la vue, mais cela semble vraiment désordonné.

J'ai joué avec la création d'une classe anonyme combinant à la fois Items et Order, mais cela n'a pas vraiment fonctionné quand il s'agissait de combiner les collections.

Je veux essentiellement à boucle à travers chaque élément et OrderItem et afficher les propriétés suivantes, sans le faire dans la vue:

Nom
Description de
Taille
Quantité

idées?

Répondre

1

Je crois, pardonnez-moi si je me trompe, mais avec EntityFramework (en supposant premier code, mais je pense que db d'abord, vous pouvez encore le faire), vous pouvez définir les paramètres suivants:

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

Et puis quand vous vous référez à Item.Name etc. il chargera paresseusement les données. Je n'ai pas accès au moment pour tester.

Espérons que cela aide, ou au moins vous guide dans la bonne direction.

Modifier

En y repensant, je crois que si vous faites db d'abord, puis aussi longtemps que vous avez la relation définie dans la base de données, alors vous devriez être en mesure d'accéder à l'élément associé de la OrderItem via la propriété de relation.

+0

Je crois que ce n'est que pour les entités de suivi de l'auto. – RPM1984

+0

Merci beaucoup, c'était beaucoup plus facile que j'avais espéré: V J'utilise le code-premier EF – George

+1

Virtual -1. C'est moche et anti-OOP. – Aliostad

1

est-Item pas censé tirer de OrderItem et vous montrer que Item qui a toutes les informations pour OrderItem et un peu plus?

Alors vous n'obtiendrez les éléments de base de données et afficher à l'aide de modèles, ...

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; } 
} 
+0

Pas tout à fait, puisque les articles existent séparément de OrderItems. Un article est un article fixe dans le système, où un article de commande est une instance de quelqu'un qui commande un article et qui nécessite une quantité. La relation is-a n'est pas maintenue dans ce cas. – George

+1

Il peut exister séparément, mais le modèle que vous apportez à l'affichage est généralement (comme le dit Scott Hanselman) une forme très dénormalisée. Très souvent, ce modèle est un ViewModel et pas le même que vous obtenez de la base de données. – Aliostad