2014-05-14 3 views
3

J'ai de la difficulté à comprendre à un niveau fondamental comment une relation un-à-plusieurs doit être gérée dans Entity Framework. Dans ma demande, j'ai deux tables, DISPLAY_MASTER, et DISPLAY_ITEMS. Leur relation est comme ceci:Comment gérer une relation un à plusieurs dans Entity Framework?

DISPLAY_MASTER.DISPLAY_ID 1 -----> * DISPLAY_ITEMS.DISPLAY_ID

Entity Framework organise ce vraiment intuitive. Je suis parti avec un objet DISPLAY_MASTER fortement typé qui a une propriété ICollection appelée DISPLAY_ITEMS.

Ma confusion réside dans la façon de sauvegarder la collection DISPLAY_ITEMS dans la base de données. Dans mon application, je lis dans tous les DISPLAY_ITEMS pour le particulier DISPLAY_MASTER en utilisant LINQ dans un objet List<DISPLAY_ITEMS> appelé _displayItems. Ceci est ensuite lié à DataGrid pour l'édition à l'aide de MVVM. L'utilisateur peut modifier DISPLAY_ITEMS existant, supprimer DISPLAY_ITEMS existant, ou ajouter DISPLAY_ITEMS en utilisant le DataGrid. Ma liaison fonctionne parfaitement et ces changements sont reflétés dans _displayItems. Une fois qu'il est temps d'enregistrer, c'est là que j'arrête de me sentir confiant dans mon code. Lorsque l'utilisateur clique enregistrer Je suis en train de la DISPLAY_MASTER est ICollection comme ceci:

_displayMaster.DISPLAY_ITEMS = _displayItems; 

Est-ce la bonne façon de travailler sur une collection Entity Framework? Ou devrais-je lier le DataGrid directement à l'objet _displayMaster.DISPLAY_ITEMS? Ou une autre méthode? La raison pour laquelle je ne suis pas sûr parce que si je tente de valider l'entité _displayMaster.DISPLAY_ITEMS utilisant:

DbEntityValidationResult validationResults = _context.Entry(_displayMaster.DISPLAY_ITEMS).GetValidationResult(); 

Je reçois une erreur disant « List1 » ne fait pas partie de la collection, qui évidemment ne semble pas juste.

Des conseils ou des instructions seraient les bienvenus.

Merci.

Répondre

1

Cela dépend.

  • Si vous déconnectez les entités de leur contexte de base de données lorsque vous les lier à la grille (si vous disposez du contexte après le chargement des entités et de créer un nouveau contexte quand il s'agit pour enregistrer les modifications) il n'est pas si facile. Vous devrez charger le maître, y compris les anciens éléments de la base de données, fusionner les modifications dans cette collection en fonction de votre nouvelle collection modifiée à partir de la grille, puis enregistrer les modifications. Un exemple de comment faire est here. Si vous conservez les entités attachées au contexte dans lequel vous les avez chargées pendant que l'utilisateur modifie, il est beaucoup plus facile de lier directement _displayMaster.DISPLAY_ITEMS à la grille car EF peut alors suivre toutes les modifications que vous effectuez la collecte et mettre à jour le graphique d'objet automatiquement à la base de données lorsque vous appelez SaveChanges.

Depuis que vous avez taguée la question avec WPF vous pourriez avoir la deuxième option (en fonction de l'architecture de votre application).Dans les applications web par exemple, la deuxième option n'existe pas du tout car toute l'édition se passe dans un navigateur qui est bien sûr déconnecté du contexte.

+0

J'ai la deuxième option, mais je suis incapable de lier directement à l'entité car elle est du type 'ICollection'. Quand je vais éditer l'enregistrement dans 'DataGrid', j'obtiens une erreur disant 'EditItem' n'est pas disponible. Est-ce que j'ai râté quelque chose? –

+0

@ user3043546: Je suggère que vous posiez une question distincte au sujet de ce problème de suivi. Cela ressemble plus à un sujet de liaison WPF qu'à un problème EF. Je ne peux pas vous aider ici, je ne suis pas assez familier avec WPF. – Slauma

+0

Merci pour vos commentaires, vous avez raison. En passant, j'ai fait plus de recherches et votre deuxième solution était la voie à suivre. –

Questions connexes