您好,登錄后才能下訂單哦!
這篇文章主要講解了“如何正常配置EF Core操作Oracle”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何正常配置EF Core操作Oracle”吧!
若要使用EF Core操作Oracle數據庫,首先需要安裝Oracle.EntityFrameworkCore。可以直接在NuGet上直接搜索安裝即可。
按照慣例創建Context類繼承DbContext和其他的數據庫沒有區別,但是我們在配置連接字符串的時候的同時需要為其指定Oracle數據庫的版本,傳入“11”代表11g,傳入“12”代表12c。
public class MyContext : DbContext { public MyContext(DbContextOptions options) : base(options) { } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseOracle( "DATA SOURCE=LOCALHOST:1521/ORACLE1;USER ID= 你的ID ;PASSWORD=你的密碼;" , b => b.UseOracleSQLCompatibility("12")); //指定數據庫版本 } }
如果我們在調試期間希望EF Core輸出執行的Sql,我使用的方式自定義一個日志類,將Sql輸出到Console中。
并在配置時將其注冊進去。
1 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 2 { 3 //配置數據庫連接 4 optionsBuilder.UseOracle( 5 "DATA SOURCE=LOCALHOST:1521/ORACLE1;USER ID= 你的ID ;PASSWORD=你的密碼;" 6 , b => b.UseOracleSQLCompatibility("12")); 7 //配置Sql輸出控制臺 8 var loggerFactory = new LoggerFactory(); 9 loggerFactory.AddProvider(new EFLoggerProvider());10 optionsBuilder.UseLoggerFactory(loggerFactory);11 12 base.OnConfiguring(optionsBuilder);13 }
由于是演示Demo,我們在開發ASP.NET Core項目時一般都是使用依賴注入來注冊。如果使用依賴注入的寫法,可以這樣寫。
services.AddDomainContext(builder => { //配置數據庫連接 builder.UseOracle( "DATA SOURCE=LOCALHOST:1521/ORACLE1;USER ID= 你的ID ;PASSWORD=你的密碼;" , b => b.UseOracleSQLCompatibility(version)); //配置Sql輸出控制臺 var loggerFactory = new LoggerFactory(); loggerFactory.AddProvider(new EFLoggerProvider()); builder.UseLoggerFactory(loggerFactory); });
在執行查詢時,需要注意的有兩點,一是Table映射的實體類的屬性名稱如果不顯式指定的話需要使用全大寫的形式,不然會報錯“ORA-00904:標識符無效”。因為生成的Sql中是將所有的字段名都用雙引號修飾的,而Oracle中存儲字段名默認都是采用全大寫的形式的。
所以如果我們不想將實體類所有的屬性名稱寫成大寫,就需要顯式的指定映射的column的名稱。可以使用DataAnnotations的特性標注所有屬性,或者在Context中指定列映射。另外如果執行查詢時需要指定Schema,也像下面這樣配置。
方法1:
protected override void OnModelCreating(ModelBuilder modelBuilder) { //判斷當前數據庫是Oracle if (this.Database.IsOracle()) { //如果需要,手動添加Schema名稱,如果是默認或者表前不需要Schema名就可以不用配置 modelBuilder.HasDefaultSchema("XUHY"); } modelBuilder.Entity<Employee>(entity => { entity.ToTable("EMPLOYEE"); entity.Property(e => e.Id).IsRequired(); 12 //列映射 entity.Property(e => e.Id).HasColumnName("ID"); entity.Property(e => e.BirthDay).HasColumnName("BIRTHDAY"); entity.Property(e => e.Department).HasColumnName("DEPARTMENT"); entity.Property(e => e.EmployeeNo).HasColumnName("EMPLOYEENO"); entity.Property(e => e.IsValid).HasColumnName("ISVALID"); entity.Property(e => e.Name).HasColumnName("NAME"); }); base.OnModelCreating(modelBuilder); }
方法2:
[Table("EMPLOYEE ")] //指定數據庫對應表名 public class Employee { [Key] //主鍵 [Column("ID")] //指定數據庫對應表欄位名稱 public long Id { get; set; } [Column("EMPLOYEENO")] public int EmployeeNo { get; set; } [Column("NAME")] public string Name { get; set; } [Column("BIRTHDAY")] public DateTime BirthDay { get; set; } [Column("DEPARTMENT")] public string Department { get; set; } [Column("ISVALID")] public bool IsValid { get; set; } }
經過上面的這些配置,便可以正常的執行數據的查詢了。
await using var context = new MyContext(options); var employeeCollection = await context.Employee.AsNoTracking().ToListAsync(); //var employeeCollection = await context.Employee.OrderBy(e => e.EmployeeNo).AsNoTracking().Skip(0).Take(5).ToListAsync();//分頁 foreach (var employee in employeeCollection) { Console.WriteLine($"{employee.Name} | {employee.EmployeeNo} | {employee.Department}"); } Console.ReadLine();
插入數據倒是和其他數據庫差別不大,但是由于Oracle天生是沒有自增Id的,如果我們設計的表的主鍵需要采用自增鍵就需要使用Sequence代替。在這種情況下就需要為實體類的主鍵指定Sequence的名稱了。
modelBuilder.Entity<Employee>(entity => { entity.ToTable("EMPLOYEE"); entity.Property(e => e.Id).IsRequired(); //!!!指定需要關聯的序列名稱!!! entity.Property(e => e.Id).UseHiLo("SEQ_EMPLOYEE_ID"); //列映射 entity.Property(e => e.Id).HasColumnName("ID"); entity.Property(e => e.BirthDay).HasColumnName("BIRTHDAY"); entity.Property(e => e.Department).HasColumnName("DEPARTMENT"); entity.Property(e => e.EmployeeNo).HasColumnName("EMPLOYEENO"); entity.Property(e => e.IsValid).HasColumnName("ISVALID"); entity.Property(e => e.Name).HasColumnName("NAME"); });
隨后便可以執行插入數據了。
var employee = new Employee() { EmployeeNo = 6, Name = "老周", Department = "d6", BirthDay = DateTime.Now.AddYears(-40), IsValid = true }; await using var context = new MyContext(options); var res = await context.Employee.AddAsync(employee); await context.SaveChangesAsync(); Console.WriteLine("添加成功"); Console.ReadLine();
以上就是簡單總結的使用EF Core操作Oracle數據庫時的一些比較特別的地方,當然本人仍在探索實踐中,如有新發現也會抽空更新上來。
感謝各位的閱讀,以上就是“如何正常配置EF Core操作Oracle”的內容了,經過本文的學習后,相信大家對如何正常配置EF Core操作Oracle這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。