Entity Framework - Nom de Colonne non Valide '*_ID"
J'ai trouvé un problème de Code entre la Première et la première Base de données EF, mais je ne suis pas sûr de la façon de le résoudre. Je vais essayer d'être aussi clair que je le peux, mais honnêtement, je suis pas certains de comprendre ici moi-même. C'est d'Entity Framework 4.4
J'ai hérité d'un projet où Entity Framework a été utilisé, mais la plupart des fichiers ont été supprimés avec pas de véritable moyen de revenir en arrière. J'ai rajouté EF (Base de données) et reproduit un T4 de configuration que le projet a été construit autour de. Il a généré des versions de code de tous les modèles de base de données et un DBContext fichier de code.
Si ma chaîne de connexion ressemble à un "normal" .NET de la chaîne de connexion, j'obtiens une erreur sur un Nom de colonne non valide "ProcessState_ID" n'existe pas. ProcessState_ID n'est pas dans la base de code, il n'est pas dans le fichier EDMX ou quoi que ce soit. Cela semble être quelque automatique EF conversion dans la requête.
Quand je fais de la chaîne de connexion correspondre au modèle d'Entity Framework, il fonctionne très bien.
Maintenant en essayant de faire correspondre le code précédent avec Entity Framework, j'aimerais garder la "normale" .NET de la chaîne de connexion.
J'ai donc deux questions ici:
1. Ce qui est un bon moyen pour aller d'un point normal de la chaîne de connexion à une EF chaîne de connexion dans le code?
2. Est-il un correctif d'ici que je ne vois pas à arrêter le nom de colonne non valide erreur?
- Cela se produit également si vous avez une propriété de navigation avec seulement un accesseur get:
public virtual Person Person { get; }
Vous devez vous connecter pour publier un commentaire.
Vérifier pour voir si vous avez des ICollections.
Ce que j'ai compris, c'est quand vous avez une ICollection qui fait référence à une table et il n'y a pas de colonne qu'il peut comprendre, il le crée pour vous d'essayer de faire le lien entre les tables. Concrètement, il arrive avec ICollection et a fait de moi "chauve-souris" en essayant de le comprendre.
C'est une entrée tardive pour ceux (comme moi) qui n'ont pas de comprendre immédiatement les 2 autres réponses.
Donc...
EF est d'essayer de la carte pour le nom ATTENDU par les PARENTS TABLEAUX-CLÉS de RÉFÉRENCE...et depuis...le nom de CLÉ ÉTRANGÈRE a été "modifiée ou réduite" dans les bases de données de la TABLE ENFANT de la relation...vous obtenez le message ci-dessus.
(ce correctif peut différer entre les versions de EF)
POUR MOI LA SOLUTION ÉTAIT:
L'AJOUT de la "ForeignKey" attribut du modèle
Category_Id
. Vous avez évoqué les correctifs pour les différentes versions de EF droit? je suis à l'aide d'EF 6.0 Quel est le fix je canadopt?*_ID
. Y compris le dos de référence a bien fonctionné.[ForeignKey("TableId")]
semblait fixer EF de la confusion sur l'endroit où trouver l'ID (comme il était à la recherche dans le mauvais endroit, au premier et validement en pensant qu'il n'existait pas).[MetadataType(typeof(MetaData))] public partial class Tour { public class MetaData { [ForeignKey(nameof(TourCategory))] public virtual TourCategory TourCategory { get; set; } } }
Holy cow - après de nombreuses heures de l'essayer, j'ai enfin compris cela.
Je suis en train de faire EF6 première base de données et je me demandais à propos de la "mesure inconnue de la colonne" erreur - c'était la génération de nom de table trait de soulignement nom de la colonne pour une raison quelconque, et essayer de trouver un inexistant colonne.
Dans mon cas, l'un de mes tableaux a deux références principales étrangères à la même clé primaire dans une autre table - quelque chose comme cela:
EF a été de générer un étrange nom de la colonne comme
Owners_AnimalID1
etOwners_AnimalID2
et a ensuite procédé à la rupture elle-même.L'astuce ici est que ces déroutant clés étrangères doivent être enregistrés auprès de l'EF en utilisant des API Fluent!
Dans votre base de données principale contexte, remplacer la
OnModelCreating
méthode et de changement de l'entité de configuration. De préférence, vous aurez un fichier séparé qui s'étend de laEntityConfiguration
classe, mais vous pouvez le faire en ligne.Quelque manière que vous le faites, vous aurez besoin d'ajouter quelque chose comme ceci:
Et avec qui, EF (peut-être) commencer à travailler comme vous le souhaitez. Boom.
En outre, vous aurez la même erreur si vous utilisez le ci-dessus avec une colonne nullable - il suffit d'utiliser
.HasOptional()
au lieu de.HasRequired()
.Voici le lien qui m'a mis sur la butte:
https://social.msdn.microsoft.com/Forums/en-US/862abdae-b63f-45f5-8a6c-0bdd6eeabfdb/getting-sqlexception-invalid-column-name-userid-from-ef4-codeonly?forum=adonetefx
Et puis, l'API Fluent docs aider, en particulier la clé étrangère exemples:
http://msdn.microsoft.com/en-us/data/jj591620.aspx
Vous pouvez aussi mettre les configurations sur l'autre extrémité de la clé, comme décrit ici:
http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx.
Il y a quelques nouveaux problèmes, je suis en cours d'exécution dans l'instant, mais qui a l'énorme écart conceptuel qui manquait. Espérons que cela aide!
Hypothèses:
Table
OtherTable
OtherTable_ID
Maintenant, choisissez l'une de ces méthodes:
A)
Supprimer
ICollection<Table>
Si vous avez une erreur liées à
OtherTable_ID
lorsque vous extrayez desTable
, allez à votreOtherTable
modèle et assurez-vous que vous n'avez pas deICollection<Table>
là. Sans une relation définie, le cadre de l'auto-supposons que vous devez avoir un FK à OtherTable et de créer ces propriétés supplémentaires dans le SQL généré.B)
OtherTableId
àTable
et
OtherTableId
dans leTable
dans la base de donnéesPour moi la cause de ce comportement était à cause de problème avec la cartographie avec l'API Fluent.
J'ai eu 2 types apparentés, où Un type avait facultatif objet de type B et de type B a eu beaucoup de objets.
J'avais défini la cartographie avec l'api fluent comme ceci:
Mais le problème, c'est que le type B a une propriété de navigation
List<A>
, donc j'ai dûSQLException Invalid column name A_Id
J'ai attaché Visual Studio de Débogage pour EF DatabaseContext.La base de données.Journal de sortie de SQL généré pour VS de Sortie->fenêtre de Débogage
Et SQL généré eu 2 relations de B tableau -> l'un avec le bon id et d'autres avec l'
A_Id
Le problème pour les le problème, c'est que je n'ai pas ajouter ce
B.List<A>
propriété de navigation dans la cartographie.Donc, c'est comment dans mon cas, corriger la cartographie devait être:
Dans mon cas, j'ai été incorrectement la définition d'une clé primaire composée de deux clés étrangères comme ceci:
L'erreur que je recevais était, "nom de colonne non valide Bar_ID".
La spécification de la clé primaire composite correctement résolu le problème:
J'ai aussi eu ce problème et il semble que il ya quelques causes différentes. Pour moi, c'était d'avoir un id de propriété, à tort, défini comme int au lieu de long dans la classe parent qui contenait une de navigation de l'objet. Le champ id dans la base de données a été définie comme bigint qui correspond à longtemps en C#. Ce n'était pas de provoquer une erreur de compilation, mais a cause de la même erreur que l'OP a:
Pour moi le problème est que j'ai eu de la table mappée dans mon application une à deux fois par le Premier Code, une fois via une Base de données en Premier.
Retrait soit on résout le problème dans mon cas.
Si vous avez des références principales étrangères à la même table plus d'une fois, vous pouvez utiliser InverseProperty
Quelque chose comme cela-
Pour moi (à l'aide de Visual Studio 2017 et la base de données-premier modèle Entity Framework 6.1.3), le problème a disparu après le redémarrage de Visual Studio et de Reconstruction.
Dans mon cas, ma graine de données de la méthode a été mise toujours sur une colonne de la table qui avait été abandonné dans une migration précédente. Vérifiez vos mappages si vous utilisez Automapper.
Dans mon cas, la cause de ce problème était un manque de contrainte de CLÉ ÉTRANGÈRE sur une migré de la base de données. De sorte que le virtuel existant ICollection n'a pas été chargé correctement.