Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF 6与ODP.Net Oracle.ManagedDataAccess一起,如何对类属性使用非大写字母?_C#_Asp.net Mvc_Entity Framework_Oracle Manageddataaccess - Fatal编程技术网

C# EF 6与ODP.Net Oracle.ManagedDataAccess一起,如何对类属性使用非大写字母?

C# EF 6与ODP.Net Oracle.ManagedDataAccess一起,如何对类属性使用非大写字母?,c#,asp.net-mvc,entity-framework,oracle-manageddataaccess,C#,Asp.net Mvc,Entity Framework,Oracle Manageddataaccess,我将EF6与ODP.NetOracle.ManagedDataAccess一起用于我的ASP.Net MVC Web应用程序 我有以下名为Employee(在Model\Employee.cs文件中)的Model: 以及EmployeeContext.cs public class EmployeeContext : DbContext { public DbSet<Employee> Employees { get; set; } protected overrid

我将EF6与ODP.Net
Oracle.ManagedDataAccess一起用于我的ASP.Net MVC Web应用程序

我有以下名为
Employee
(在
Model\Employee.cs
文件中)的
Model

以及
EmployeeContext.cs

public class EmployeeContext : DbContext {
    public DbSet<Employee> Employees { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        modelBuilder.HasDefaultSchema("myschema");
    }
}
当我得到以下内部异常错误时:

Oracle.ManagedDataAccess.Client.OracleException:ORA-00904:“扩展名1”。“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) )
它工作得非常好。但我不想那样

作为一名典型的C#编码器,我发现类字段/属性都使用大写字母是很不寻常的

我的问题是,是否有任何方法可以使用大写字母和小写字母的组合来保留类属性,但仅用于查询这些属性的生成大写字母版本


再说一遍,我使用EF
6.0.0.0
和ODP.Net
Oracle.ManagedDataAccess
version
4.121.2.0
Oracle.ManagedDataAccess.EntityFramework
version
6.121.2.0
,如果这些都很重要的话。

您可以使用每个属性上的
数据属性来指定在创建的表与
table
属性非常相似。然后,您的实际属性名称可以正确格式化:

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

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

    etc...
}
更多信息:

您还可以在
DbContext
中使用fluent API指定列名映射:

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");
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
//配置列
modelBuilder.Entity()
.Property(p=>p.Id)
.姓名(“ID”);
modelBuilder.Entity()
.Property(p=>p.Name)
.姓名(“姓名”);
}
参考资料:

更自动化(更容易)的方法是利用EF功能

首先,您需要这样一个简单的类

using System.Data.Entity.ModelConfiguration.Conventions;
using System.Data.Entity.Core.Metadata.Edm;

public class UppercaseColumnNameConvention : IStoreModelConvention<EdmProperty>
{
    public void Apply(EdmProperty item, DbModel model)
    {
        item.Name = item.Name.ToUpper();
    }
}
使用System.Data.Entity.ModelConfiguration.Conventions;
使用System.Data.Entity.Core.Metadata.Edm;
公共类大写ColumnNameConvention:IStoreModelConvention
{
公共无效应用(EdmProperty项,DbModel模型)
{
item.Name=item.Name.ToUpper();
}
}
然后在你的课堂上

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Add<UppercaseColumnNameConvention>();
    // ...
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Add();
// ...
}

你已经完成了。

这是代码生成的吗,还是你必须手工编写所有这些属性的代码?@RobertHarvey当然你可以生成它,这取决于你如何生成,但将其添加到模板中应该相当直接。啊,所以修改T4模板以包含这些属性。“看起来很合理。”罗伯塔维,是的。我自己不使用T4模板,但我想这与您对表名所做的操作是一样的。@RobertHarvey,不要忘记,这是一个代码优先的解决方案,您只需要在设置DTO时执行一次,然后就可以忽略它。这是一个有趣的问题。我想知道为什么您的表列名首先是大写的。您不是在使用代码优先迁移吗?根据您的要求,列名应该与您在实体类中定义的列名完全相同。@IvanStoev我使用Toad for Oracle创建了我的表。也许,这是部分原因。我明白了。公认的答案是可行的,但太烦人了。你可以找到这篇文章,特别是作者的答案。@IvanStoev嗨,谢谢你的链接!我发现它很有用!:)嗨,伊万,谢谢你昨天的指导。我用Gert Arnold的解决方案更新了代码。而且效果很好。你得到了我的一票Hi@Ian,我决定发布这篇文章,因为它是在应用了其他配置之后运行的,比如
Column
attributes等等,所以它与实际的列名一起工作,并强制使用大写字母,而Gert解决方案与CLR属性名一起工作,并且可以被其他配置播放器覆盖(我想他提到了这一点)。干杯啊,我明白了。。。您的意思是,此解决方案对涉及的多个参与者更为健壮(不是吗?或者您的案例也可能被覆盖-因为两者都使用
OnModelCreating
?)。就我而言,唯一的玩家是我。:)尽管如此,您肯定会为需要额外健壮性功能的用户提供另一种自动化解决方案。;)你说得对。我所说的玩家是指属性、流畅的配置等,实际上似乎非常强大——所有的EF内部约定都是用这样的类实现的。无论如何,我也在学习自己,正如第一条评论中提到的,这很有趣:)@Toolkit这个问题是关于列名的。对于表名,您可以尝试另一种类似于
公共类UppercaseTableNameConvention:IStoreModelConvention{public void Apply(EntityType项,DbModel模型){var entitySet=model.StoreModel.Container.EntitySets.FirstOrDefault(x=>x.ElementType==item);if(entitySet!=null){entitySet.Table=entitySet.Table.ToUpper();}}}}
在内部,您可以修改
entitySet
表和
架构
属性。
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");
}
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Data.Entity.Core.Metadata.Edm;

public class UppercaseColumnNameConvention : IStoreModelConvention<EdmProperty>
{
    public void Apply(EdmProperty item, DbModel model)
    {
        item.Name = item.Name.ToUpper();
    }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Add<UppercaseColumnNameConvention>();
    // ...
}