EntityFramework Code First Oracle

我有跟随上下文,映射和用于与oracle一起工作的类:

public class Context : DbContext { public string Schema { get; set; } public Context(string connectionString) : base(connectionString) { } public DbSet UserDbSet { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new UserMapping(Schema)); } } public class User { public decimal Id { get; set; } public string Name { get; set; } public string LastName { get; set; } } public class UserMapping : EntityTypeConfiguration { public UserMapping(string schema = "dbo") { HasKey(t => t.Id); ToTable(schema + ".TBLUSER"); Property(t => t.Id).HasColumnName("Id"); Property(t => t.Name).HasColumnName("NAME"); Property(t => t.LastName).HasColumnName("LASTNAME"); } } 

但当我打电话给:

 var context = new Context("name=ORACLE") { Schema = "USERTABLESPACEDEFAULT" }; var users = context.UserDbSet.ToList(); 

oracle Privider向我显示了以下错误:

{“ORA-00904:\”Extent1 \“。\”Id \“:无效的标识符”}

这就是为什么EntityFrameworks尝试执行以下查询:

 SELECT "Extent1"."Id" AS "Id", "Extent1"."NAME" AS "NAME", "Extent1"."LASTNAME" AS "LASTNAME" FROM "USERTABLESPACEDEFAULT"."TBLUSER" "Extent1" 

任何.dll它的必需品?

这是我的connectionString:

  

我最近遇到了大写名称和Oracle的相同问题,所以现在有Nuget包可以解决这个问题。

包括EntityFramework.OracleHelpers和oneliner将应用大写表,列和外键约定。

  using EntityFramework.OracleHelpers; protected override void OnModelCreating(DbModelBuilder modelBuilder) { this.ApplyAllConventionsIfOracle(modelBuilder); } 

更多信息和示例在GitHub页面 。

Ty改变这一行:

 Property(t => t.Id).HasColumnName("Id"); 

……对此:

 Property(t => t.Id).HasColumnName("ID"); // Upper case ID. 

默认情况下,Oracle的列名称为大写。 当EF生成用双引号括起来的名字时,你必须确保正确的套管。

如果你真的想继续使用"Id" ,那么你要么必须找到一种方法让EF不在Id周围放置双引号,以便名称检查不区分大小写(我不知道该怎么做)。

或者,您必须将Oracle中的列重命名为Id

 alter table tbluser rename column id to "Id"; 

但实际上,我认为您应该将您的字符串更改为"ID"并完成它。