我有以下上下文,用于与oracle一起工作的映射和类:
public class Context : DbContext
{
public string Schema { get; set; }
public Context(string connectionString)
: base(connectionString)
{
}
public DbSet<User> 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<User>
{
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向我显示了以下错误:
{&#34; ORA-00904:\&#34; Extent1 \&#34;。\&#34; Id \&#34;:无效的标识符&#34;} < / p>
这就是EntityFrameworks尝试执行以下查询的原因:
SELECT
"Extent1"."Id" AS "Id",
"Extent1"."NAME" AS "NAME",
"Extent1"."LASTNAME" AS "LASTNAME"
FROM "USERTABLESPACEDEFAULT"."TBLUSER" "Extent1"
任何.dll必要的吗?
这是我的connectionString:
<add name="ORACLE" connectionString="DATA SOURCE=localhost:1521/XE;PASSWORD=Isolucion2015*;USER ID=SYSTEM" providerName="Oracle.DataAccess.Client" />
答案 0 :(得分:5)
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"
并完成它。
答案 1 :(得分:1)
我最近遇到了大写名称和Oracle的相同问题,所以现在有Nuget包可以解决这个问题。
包括EntityFramework.OracleHelpers和oneliner将应用大写表,列和外键约定。
using EntityFramework.OracleHelpers;
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
this.ApplyAllConventionsIfOracle(modelBuilder);
}
更多信息和示例位于GitHub page。