EntityFramework Code First Oracle

时间:2015-07-13 17:12:23

标签: c# oracle entity-framework

我有以下上下文,用于与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" />

2 个答案:

答案 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