10
votes

Cadre d'entité et héritage: NotsupportedException

Je reçois

système.Notsupportedexception: tout objets dans l'entité 'Entités.message' doit avoir unique unique clés primaires. Cependant, une instance de Tapez 'Model.Message' et une instance de type 'model.cment' les deux ont la même valeur de clé primaire p> BlockQuote>

Mais je n'ai aucune idée de ce que cela signifie. P>

Utilisation de EF4, j'ai une bande d'entités de type message. Certains de ces messages sont en réalité un sous-type, un commentaire, une héritage par type de table. Juste P>

 DB.Message.First();


6 commentaires

Pouvez-vous poster les signatures du message et des classes de commentaire?


Désolé, je ne te comprends pas. Voulez-vous voir les membres? Tous ou juste les celles générées par EF?


Avez-vous vérifié ce bogue? Connect.Microsoft.com/visualstudio/feedback/Détails/544639/...


Compliqué. Sentiment intestinal: ça ne s'applique pas. Si tout le reste échoue, je vais y examiner.


Pourriez-vous poster le coup d'écran du diagramme?


Que recherchez vous exactement? Les deux diagrammes semblent normaux. J'ai une autre relation similaire ailleurs dans mon modèle, il n'y a vraiment aucune différence sauf que celle-ci ne fonctionne pas.


3 Réponses :


0
votes

Je ne suis pas un type de gars EF (occupé à travailler avec NHibernate, n'a pas encore eu le temps de se mettre à jour avec EF) afin que je puisse être totalement faux ici, mais le problème peut-il être que les deux tables (depuis Vous utilisez l'héritage par table-par-type) ont des clés primaires qui entrent en collision?

Si vous vérifiez les données dans les deux tables, effectuez-vous des valeurs principales de clé?


1 commentaires

Eh bien, oui, comme ils le devraient. Si vous ne me croyez pas, croyez EF. Il y a une petite commande nifty appelée "Build Base de données de modèle" ...



1
votes

On dirait que vous tirez deux enregistrements en mémoire un dans le message et un en commentaire.

Les prblems possibles:

  • Il y a deux messages physiques avec le même identifiant
  • Le même message est en train d'être tiré en tant que message et un commentaire
  • Le même message est éteint deux fois dans le même contexte

    Que le problème disparaisse parfois lorsque vous redémarrez, indique un problème de nettoyage du contexte. Utilisez-vous des déclarations "Utilisation".

    Avez-vous des fonctionnalités pour passer d'un message à un commentaire?


0 commentaires

2
votes

Lorsque vous déduisez, on dirait que le contexte est de chercher un commentaire sous forme de message (ne sachant pas qu'il s'agit d'un commentaire). Plus tard, vous demandez le commentaire actuel, alors le contexte récupère le commentaire. Maintenant, vous avez deux instances d'objet dans le contexte avec le même ID - un est un message et un commentaire.

Il semble que l'exception ne soit projetée qu'après que les deux objets ont été chargés (c'est-à-dire lorsque vous essayez d'accéder au message la deuxième fois). Si vous pouvez trouver un moyen de supprimer le message du contexte lorsque le commentaire est chargé, cela peut résoudre votre problème.

Une autre option peut être d'utiliser le modèle de table-per-hiérarchie. Il en résulte une mauvaise conception de base de données, mais à la fin de la journée, vous devez utiliser ce qui fonctionne.

Vous pourriez être capable d'éviter le problème en veillant à ce que les objets soient chargés d'abord comme des commentaires. De cette façon, lorsque vous demandez le message, le contexte le sait déjà.

Envisagez également d'utiliser Composition sur l'héritage , telle qu'un message a 0 ..1 commentaires.

La suggestion finale consiste à supprimer la dépendance dans le cadre d'entité à partir de votre code de contrôle et à créer une couche d'accès aux données qui fait référence à l'EF et récupère vos objets. Le DAL peut transformer des objets de cadre d'entité dans un ensemble d'objets d'entité différents qui sont plus faciles à utiliser dans le code. Cette approche produira beaucoup de frais généraux de code, mais peut être approprié si vous ne pouvez pas utiliser le cadre d'entité pour produire un modèle d'entité qui représente vos entités de la manière dont vous voulez travailler avec eux.

Résumer, sauf si Mme corrige ce problème, il n'y a pas de solution à votre problème qui n'implique pas de repenser votre approche. Malheureusement, le framework entité n'est pas idéal, en particulier pour les modèles d'entité complexes - vous serez peut-être préférable de créer votre propre dal et de contourner l'EF tout à fait.


0 commentaires