Oracle.ManagedDataAccess
ASP.Net MVC Web アプリケーションのODP.Net で EF 6 を使用しています。
私は(ファイル内で)以下Model
を呼び出しています:Employee
Model\Employee.cs
[Table("TBLEMPLOYEE")]
public class Employee {
public int Id { get; set; }
public string Name { get; set; }
public string 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 string City { get; set; }
}
としてもEmployeeContext.cs
public class EmployeeContext : DbContext {
public DbSet<Employee> Employees { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
modelBuilder.HasDefaultSchema("myschema");
}
}
次に、私のでは、次のようEmployeeController.cs
に を使用します。Employee
EmployeeContext
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);
}
}
次の内部例外エラーが発生した場合:
Oracle.ManagedDataAccess.Client.OracleException: ORA-00904: "Extent1"."Id": 無効な識別子
例外エラーは次の場所で発生します。
Employee employee = employeeContext.Employees.Single(x => x.ID == id);
デバッグ出力コンソールを使用してさらにデバッグを行っていると、EF が次の SQL クエリを生成してデータを取得していることに気付きました。
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) )
" "
さらに調査を行ったところ、SQL クエリの列名 ( 、 など."Id"
)に引用符が含まれているため".EmployeeType"
、".HourlyPay"
クエリが一致する列名を見つけられないことがわかりました。Oracle データ テーブルの列名はすべて大文字で表されます (つまり."ID"
、".EMPLOYEETYPE"
、".HOURLYPAY"
など)。
さて、クラス定義を次のように変更すると:
[Table("TBLEMPLOYEE")]
public class Employee {
public int ID { get; set; }
public string NAME { get; set; }
public string 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 string CITY { get; set; }
}
それは完全にうまく機能します。しかし、私はそれを望んでいません。
典型的な C# コーダーとして、クラスのフィールド/プロパティがすべて大文字であることは非常に珍しいことでした。
私の質問は、大文字と小文字の組み合わせを使用してクラス プロパティを保持する方法はありますか?
繰り返しますが、EF6.0.0.0
と ODP.Net のOracle.ManagedDataAccess
バージョン4.121.2.0
と、それらが重要な場合はOracle.ManagedDataAccess.EntityFramework
バージョンを使用します。6.121.2.0