Comment configurer DbContext de travailler avec Oracle ODP.Net et EF CodeFirst?
Je suis en train de travailler avec EF CodeFirst sous Oracle avec ODP.net. C'est ma classe DbContext:
public class MyCEContext : DbContext {
public DbSet<Person> Persons { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
modelBuilder.Entity<Person>().ToTable("PERSONS","myce");
}
public MyCEContext() :
base(new OracleConnection(
"Data Source=cebd; User ID=myce; Password=****;"), true) {}
}
Problème est que lorsque je tente de faire quelque chose comme ceci:
MyCEContext context = new MyCEContext();
Person p = context.Persons.Find(1);
J'obtiens cette erreur interne:
{"ORA-00942: table or view does not exist"}
Et la table existe.
Ce que je fais mal?
OriginalL'auteur fcaldera | 2012-03-15
Vous devez vous connecter pour publier un commentaire.
Comme Nick l'a écrit dans sa réponse, le problème est lié avec les guillemets et le cas de la requête générée, mais pas avec la table de noms, mais avec du schéma nom:
Donc la solution est très simple, il suffit de majuscules, l'id utilisateur et le nom du schéma:
En général, toutes les doit être en majuscules: tableaux, de schémas et de noms. Mais il est préférable d'annoter chaque propriété mappée avec l'attribut de la Colonne, au lieu de majuscules, le nom de la propriété:
Ainsi que les noms sera plus facile à lire dans les deux bases de données et des classes.
Pourriez-vous mettre un peu de code à partir de vos classes ou des mappages?
semblait être une faute de frappe dans celui de la table d'attributs d'annotation, de sorte qu'il semble que DbSet.Trouver traverse toutes les classes et cartes em à leurs tables lors de l'utilisation SingleOrDefault() seules les cartes au moment de l'exécution les tables nécessaires pour que la requête parce que j'ai remarqué la faute de frappe. Je pensais que depuis SingleOrDefault travaillé tous les noms de table étaient très bien. Donc, c'est une longue histoire courte, Trouver des cartes de votre ensemble de DbContext des listes d'objets.
OriginalL'auteur fcaldera
Votre problème est probablement parce que EF transmet la requête à l'Oracle de guillemets, ce qui signifie que les cas sur vos tables et vos champs doit correspondre à celui de la base de données.
Donc, si vous avez eu la suivante:
L'EF code sera probablement de tir le SQL suivant:
Ajouter à votre OnModelCreating fonction:
...et de construire votre objet POCO avec les majuscules des noms de propriété plutôt que la normale sentance cas.
Si vous voulez voir le SQL, briser le code et de prendre un coup d'oeil à la DbContext.Les personnes de l'objet. Vous devriez voir la commande sql pour interroger l'ensemble de la table (assez grandes)
Note
Nous utilisons Oracle EF Premier Code en production. Bien que n'étant pas officiellement pris en charge, il ne semble pas être quelque chose de manquant de la dernière version ODAC qui vous en empêche.
OriginalL'auteur Nick
Vous pouvez appeler ToString sur la requête linq que vous exécutez à l'encontre de votre dbcontext objet. Cela va vous montrer le code SQL généré. Qui devrait vous aider à trouver le problème
Mon problème était deux fois:
OriginalL'auteur Barry
Si vous ne voulez pas de mapper chaque colonne de votre application comme une solution de contournement pour le citant problème, mentionné par @fcaldera, vous pouvez utiliser le bouton "Devart de dotConnect for Oracle".
Et simplement le code suivant est nécessaire:
Maintenant, vous pouvez mapper une classe "Monobjet" à une table MYOBJECT sans problèmes. Et c'est la même chose pour les colonnes.
Remarque: NuGet version de "dotConnect for Oracle" ne prend pas en charge Entity Framework. Il est nécessaire de télécharger la version d'essai ou une version professionnelle de Devart du site.
OriginalL'auteur