Impossible d'enregistrer l'Entité Cadre Hérité de types
J'ai mis en œuvre une table par type d'héritage dans mon modèle de données (essentiellement, ont BaseEntity
type avec toutes les informations de la base pour mes articles et un Employer
type qui hérite de la BaseEntity
élément). Tout semble être mis en place correctement et lors de l'utilisation d'Entités (soit via ADO.net Services de Données ou via Linq to entities), je peux voir la Employer
type et les choses semblent bien se passer. Le problème commence quand je crée un nouveau Employer
entité et de tenter de le sauver.
Sur le contexte qui ne semble pas être un .AddToEmployer
point seulement et AddObject
ou AddToBaseEntity
).
Si j'utilise AddObject("Employer", NewEmployer)
je reçois un message d'erreur:
L'EntitySet nom " DataEntities.Employeur " ne peut pas être trouvé.
Si j'utilise AddToBaseEntity(NewEmployer)
j'obtiens un message d'erreur:
Pas en mesure de déterminer valide la commande pour les opérations dépendantes. Les dépendances peuvent exister en raison de contraintes de clés étrangères, les exigences des modèles orstore des valeurs générées.
Ai-je manqué une étape dans la mise en possession de l'héritage? Est-il une manière spécifique pour sauvegarder les objets qui sont héritées? Ce que je fais mal? Je suppose que la question fondamentale est que je doit avoir un AddToEmployer
, que dois-je faire pour obtenir que les exposés? Il semble étrange que ce n'est pas une option, car je peux voir le type d'Employeur sur le côté client et peut faire des choses telles que:
var NewEmployer = new Employer()
- qui semble suggérer que je peux voir le type d'Employeur amende.
OriginalL'auteur ChrisHDog | 2008-10-17
Vous devez vous connecter pour publier un commentaire.
Mon Nom est Phani et je travail sur la ADO.NET Services de Données de l'équipe.
La
ResolveName
etResolveType
méthodes pour vous aider à personnaliser le type d'informations que le client écrit dans la charge utile est envoyé au serveur et comment la réponse de la charge utile à partir du serveur est matérialisé .Ils vous aider à résoudre des types sur le client, et est utile dans de nombreux scénarios , quelques exemples sont :
ResolveName
est utilisé pour modifier le nom de l'entité que nous mettons sur le fil lors d'une requête sur le serveur.Considérer ce modèle de données :
Sur Le Serveur
Lorsque vous utilisez le client de travailler avec les instances de l'Entité Gestionnaire de Type ,
au moment de présenter les modifications sur le serveur, nous nous attendons à ce type d'informations pour être présents dans la charge utile lorsque des entités de participer à l'héritage.
Toutefois, lorsque le client sérialise cette charge, il met en "Employé" comme le nom du type
ce qui n'est pas ce qui est attendu sur le serveur.
Par conséquent, vous devez fournir un nom de résolution sur le client,
un Type de résolution est utilisé de la même manière .
OriginalL'auteur Phani Raj
Eh bien, vous obtenez seulement une entité régler le pr. classe de base .AddToBaseEntity est la solution en tant que telle.
Mais il semble que vous avez une dépendance circulaire dans votre modèle, de sorte que le cadre de l'Entité ne peut pas déterminer l'ordre dans lequel enregistrer.
Vérifiez que vous avez les clés étrangères de la baseentity sur votre dérivés des entités et mise à jour de votre modèle.
OriginalL'auteur Luhmann
J'ai changé quelques petites choses et a réussi à obtenir que cela fonctionne. Je ne suis pas particulièrement sûr de ce qu'a été la base du problème, mais je voulais poster ce que j'ai fait pour référence.
Reconstruit Tables: j'ai reconstruit les tables de départ avec juste l'ID/colonnes de Clé et une seule colonne de données.
Retiré supplémentaire auto-incrémentation de champs: j'ai eu une auto-incrémentation ID sur le BaseEntity et à l'Employeur. J'ai enlevé l'auto-incrémentation d'une pièce d'identité de l'Employeur et juste eu l'Employeur.BaseEntityID et de colonne de la clé étrangère dans BaseEntity.BaseEntityID. (cela semble avoir été le coupable, mais j'étais sous l'impression que ce qui était autorisé)
Malheureusement, cela conduirait alors à la question que enherited classes dans le cadre de l'entité ne peut pas avoir les propriétés de navigation (toutes les propriétés de navigation doit être sur l'entité de base) donc, l'héritage va s'avérer non-utilisable pour nos besoins.
OriginalL'auteur ChrisHDog
Vous n'avez pas d'Employeur définie comme entité de série, tout comme le type d'entité. C'est la façon qui vous manque AddToEntity dans le contexte de l'objet. Il y a toujours une entité définie pour une hiérarchie de classe, dans ce cas, il est BaseClass entité.
Si vous souhaitez obtenir de l'entité 'Employeur', vous pouvez essayer de modifier manuellement les fichier edmx et d'ajouter de nouveaux entité "Employeur", puis définissez le type d'entité "Employeur" à faire partie de cette entité. Il ne devrait pas être dur, j'ai fait beaucoup de fois.
Je ne suis pas sûr si il y en a de plus en plus réguliers solution.
OriginalL'auteur Nenad Dobrilovic
Venir plus de deux ans plus tard, mais dans l'intérêt de la garder pertinentes pour le trafic de recherche, voici comment j'ai travaillé autour de cette rapidement dans une classe commodité que nous avons été à l'aide de peupler rapidement notre base de données avec mise en scène des données.
Ne savez pas sur les versions antérieures, mais Entity Framework 4 vous permet de vider l'objet dans le contexte d'un objet de base, et puis le cadre de chiffres sur le côté serveur de références. Ainsi, vous n'auriez pas utilisé AddToInheritedObjects() (qui est déprécié de toute façon), mais plutôt la ObjectSet<>.Méthode Add ().
Voici une aide de l'exemple de classe:
Ainsi, en supposant que vous avez les éléments suivants:
Vous pouvez facilement ajouter des entités du contexte:
Souvenir, bien sûr, que ContextHelper devrait avoir un public méthode Save() qui appelle _context.SaveChanges()- ou que vous devriez avoir une autre façon de pousser l'objet de modifications jusqu'à la banque de données.
Ce ne serait pas une réponse directe à une question à propos de l'héritage, mais, espérons-le, donne aux gens un point de départ pour répondre à des spécificités.
OriginalL'auteur JohnMetta