EF 6 avec ODP.Net Oracle.ManagedDataAccess, Comment utiliser une lettre non en majuscule pour les propriétés de classe?

J’utilise EF 6 avec ODP.Net Oracle.ManagedDataAccess pour mon application Web ASP.Net MVC.

J’ai le Model suivant appelé Employee (dans le fichier Model\Employee.cs ):

 [Table("TBLEMPLOYEE")] public class Employee { public int Id { get; set; } public ssortingng Name { get; set; } public ssortingng Gender { get; set; } public DateTime DateOfBirth { get; set; } public int EmployeeType { get; set; } public double? AnnualSalary { get; set; } public double? HourlyPay { get; set; } public double? HoursWorked { get; set; } public ssortingng City { get; set; } } 

Ainsi que EmployeeContext.cs

 public class EmployeeContext : DbContext { public DbSet Employees { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.HasDefaultSchema("myschema"); } } 

Ensuite, dans mon EmployeeController.cs , j’utilise l’ Employee et l’ EmployeeContext comme ceci:

 public ActionResult Details(int id = 1) { try { EmployeeContext employeeContext = new EmployeeContext(); employeeContext.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); Employee employee = employeeContext.Employees.Single(x => x.ID == id); return View(employee); } catch (Exception e) { return View(e); } } 

Lorsque j’obtiens l’erreur d’exception interne suivante:

Oracle.ManagedDataAccess.Client.OracleException: ORA-00904: “Extent1”. “Id”: identificateur non valide.

L’erreur d’exception se produit dans:

 Employee employee = employeeContext.Employees.Single(x => x.ID == id); 

Au fur et à mesure que je débogue en utilisant ma console de sortie Debug, j’ai remarqué que l’EF génère la requête SQL suivante pour extraire les données:

 SELECT "Extent1"."Id" AS "Id", "Extent1"."Name" AS "Name", "Extent1"."Gender" AS "Gender", "Extent1"."DateOfBirth" AS "DateOfBirth", "Extent1"."EmployeeType" AS "EmployeeType", "Extent1"."AnnualSalary" AS "AnnualSalary", "Extent1"."HourlyPay" AS "HourlyPay", "Extent1"."HoursWorked" AS "HoursWorked", "Extent1"."City" AS "City" FROM "MYSCHEMA"."TBLEMPLOYEE" "Extent1" WHERE ("Extent1"."Id" = :p__linq__0) AND (ROWNUM <= (2) ) 

Et comme je fais quelques recherches supplémentaires, je comprends qu’en raison des guillemets " " présents dans les noms des colonnes de requête SQL (tels que ."Id" , ".EmployeeType" , ".HourlyPay" , etc.), requête ne peut pas trouver les noms de colonne correspondants, car le nom de colonne de la table de données Oracle est représenté en majuscules (c’est-à-dire: ".EMPLOYEETYPE" , ."ID" ".EMPLOYEETYPE" , ".HOURLYPAY" , etc.).

Maintenant, quand j’ai changé la définition de la classe en quelque chose comme ceci:

 [Table("TBLEMPLOYEE")] public class Employee { public int ID { get; set; } public ssortingng NAME { get; set; } public ssortingng GENDER { get; set; } public DateTime DATEOFBIRTH { get; set; } public int EMPLOYEETYPE { get; set; } public double? ANNUALSALARY { get; set; } public double? HOURLYPAY { get; set; } public double? HOURSWORKED { get; set; } public ssortingng CITY { get; set; } } 

Cela fonctionne parfaitement bien. Mais je ne veux pas ça .

En tant que codeur C # typique, j’ai trouvé assez inhabituel d’avoir toutes les lettres majuscules pour les champs / propriétés de classe.

Ma question est la suivante: existe-t-il un moyen de conserver les propriétés de classe en utilisant une combinaison de lettres majuscules et minuscules, uniquement pour interroger et générer la version en lettres majuscules générées de ces propriétés?

Encore une fois, j’utilise EF 6.0.0.0 et ODP.Net Oracle.ManagedDataAccess version 4.121.2.0 et Oracle.ManagedDataAccess.EntityFramework version 6.121.2.0 si cela importe.

Vous pouvez utiliser l’atsortingbut de données de Column sur chaque propriété pour spécifier le nom de la colonne mappée à utiliser lors de la création de la table, de la même manière que l’atsortingbut Table . Ensuite, vos noms de propriété réels peuvent être correctement formatés:

 [Table("TBLEMPLOYEE")] public class Employee { [Column("ID")] public int Id { get; set; } [Column("NAME")] public ssortingng Name { get; set; } etc... } 

Plus d’informations: https://msdn.microsoft.com/en-us/data/jj591583.aspx#TableColumn

Vous pouvez également utiliser l’API fluide dans votre DbContext pour spécifier un mappage de nom de colonne:

 protected override void OnModelCreating(DbModelBuilder modelBuilder) { //Configure Column modelBuilder.Entity() .Property(p => p.Id) .HasColumnName("ID"); modelBuilder.Entity() .Property(p => p.Name) .HasColumnName("NAME"); } 

Référence: http://www.entityframeworktutorial.net/code-first/configure-property-mappings-using-fluent-api.aspx

Une méthode plus automatisée (plus simple) consisterait à utiliser la fonction EF Custom Code First Conventions .

D’abord, vous aurez besoin d’un cours simple comme celui-ci.

 using System.Data.Entity.ModelConfiguration.Conventions; using System.Data.Entity.Core.Metadata.Edm; public class UppercaseColumnNameConvention : IStoreModelConvention { public void Apply(EdmProperty item, DbModel model) { item.Name = item.Name.ToUpper(); } } 

puis dans votre classe de contexte

 protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Add(); // ... } 

et vous avez terminé.