[英]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.