3

Oracle.ManagedDataAccessASP.Net MVC Web アプリケーションのODP.Net で EF 6 を使用しています。

私は(ファイル内で)以下Modelを呼び出しています:EmployeeModel\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に を使用します。EmployeeEmployeeContext

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

4

2 に答える 2

4

各プロパティの data 属性を使用Columnして、属性とほぼ同じように、テーブルの作成時に使用するマップされた列名を指定できTableます。次に、実際のプロパティ名を正しくフォーマットできます。

[Table("TBLEMPLOYEE")]
public class Employee {
    [Column("ID")]
    public int Id { get; set; }

    [Column("NAME")]
    public string Name { get; set; }

    etc...
}

詳細: https://msdn.microsoft.com/en-us/data/jj591583.aspx#TableColumn

流暢な API を使用してDbContext、列名のマッピングを指定することもできます。

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

    modelBuilder.Entity<Employee>()
                .Property(p => p.Name)
                .HasColumnName("NAME");
}

参照: http://www.entityframeworktutorial.net/code-first/configure-property-mappings-using-fluent-api.aspx

于 2016-02-16T04:26:25.620 に答える