簡體   English   中英

EntityFramework代碼優先Oracle

[英]EntityFramework Code First Oracle

我具有用於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向我顯示以下錯誤:

{“ ORA-00904:\\” Extent1 \\“。\\” Id \\“:無效的標識符”}

這就是為什么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" />

請更改此行:

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"並完成操作。

最近,我遇到了大寫名稱和Oracle的相同問題,因此現在有了Nuget軟件包來解決。

包括EntityFramework.OracleHelpers和執行oneliner將應用大寫的表,列和外鍵約定。

  using EntityFramework.OracleHelpers;

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

更多信息和示例在GitHub頁面上

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM