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"
并完成它。