EF Core + Oracle自动生成数据库

EF Core + Oracle自动生成数据库

1、登录orcale 11g 授权

SQL> connect / as sysdba;
SQL> create user myuser identified by 123456;
SQL> grant connect, resource to myuser;

2、vs 2019 中新建EFcoreOracleTest,代码如下

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;

namespace ConsoleCoreTest
{
    public class EFcoreOracleTest
    {
        public static void Test()
        {
            using var context = new MyContext();
            context.Database.EnsureDeleted();
            context.Database.EnsureCreated();
            Console.WriteLine("数据库创建成功");
            var employeeadd = new Employee()
            {
                EmployeeNo = 100210,
                Name = "zhangsan",
                Department = "dept006",
                BirthDay = DateTime.Now.AddYears(-40),
                IsValid = true
            };
            var res = context.Set<Employee>().Add(employeeadd);
            context.SaveChanges();
            Console.WriteLine("添加成功");
            var employeeCollection = context.Set<Employee>().ToList();
            //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();

          
            Console.ReadLine();
        }
    }


    public class MyContext : DbContext
    {
        //public MyContext(DbContextOptions options) : base(options)
        //{ }

        //public MyContext() { }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            //按照惯例创建Context类继承DbContext和其他的数据库没有区别,但是我们在配置连接字符串的时候的同时需要为其指定Oracle数据库的版本,传入“11”代表11g,传入“12”代表12c//optionsBuilder.UseOracle("Data Source=127.0.0.1:1521/orcl;USER ID=evms;PASSWORD=123456;"
            //    , b => b.UseOracleSQLCompatibility("11"));   //指定数据库版本

            //注意:在使用Oracle的时候一定要先请DBA将账号建制好
            //optionsBuilder.UseOracle(
            //    "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SID=orcl)));User Id=evms;Password=123456;"
            //    , b => b.UseOracleSQLCompatibility("11"));   //指定数据库版本

             optionsBuilder.UseOracle("Data Source=127.0.0.1:1521/orcl;USER ID=my;PASSWORD=123456;"
                , b => b.UseOracleSQLCompatibility("11"));   //指定数据库版本

        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            //判断当前数据库是Oracle
            if (Database.IsOracle())
            {   //如果需要,手动添加Schema名称,如果是默认或者表前不需要Schema名就可以不用配置
                //modelBuilder.HasDefaultSchema("EVMS");//如果使用Oracle必须手动添加Schema,判断当前数据库是Oracle 需要手动添加Schema(DBA提供的数据库账号名称)

                //如果使用Oracle必须手动添加Schema,判断当前数据库是Oracle 需要手动添加Schema(DBA提供的数据库账号名称)
                modelBuilder.HasDefaultSchema("MY");//注意:DBA提供的数据库账号名称,必须大写
            }
            modelBuilder.Entity<Employee>(entity =>
            {
                entity.ToTable("EMPLOYEE");
                entity.Property(e => e.Id).IsRequired();//列映射

                  //oracle没有自增主键,只能通过序列自增,ForOracleUseSequenceHiLo可以实现递增
                  //entity.Property(e => e.Id).HasColumnName("ID").ForOracleUseSequenceHiLo("EMPLOYEE_ID_SQ1");
                  //entity.Property(e => e.Id).UseHiLo("EMPLOYEE_ID_SQ1").HasColumnName("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");
            });

                //一旦打包到docker运行 就会查询不到数据,可能是时区有问题,在dockerfile中添加如下语句 在生成的时候 设置好时区:
                //FROM microsoft/ dotnet:3.1 - aspnetcore - runtime
                //ENV TZ = Asia / Shanghai

//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");
            //});
            base.OnModelCreating(modelBuilder);
        }
    }

    [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; }
    }
}

注意:

1、首先要在oracle11g数据库中创建用户和授权

2、、指定数据库版本

OnConfiguring中

//按照惯例创建Context类继承DbContext和其他的数据库没有区别,但是我们在配置连接字符串的时候的同时需要为其指定Oracle数据库的版本,传入“11”代表11g,传入“12”代表12c。

optionsBuilder.UseOracle("Data Source=127.0.0.1:1521/orcl;User Id=my;Password=123456;"
, b => b.UseOracleSQLCompatibility("11")); //指定数据库版本

3、OnModelCreating中

//判断当前数据库是Oracle
if (Database.IsOracle())
{ //如果需要,手动添加Schema名称,如果是默认或者表前不需要Schema名就可以不用配置
//modelBuilder.HasDefaultSchema("EVMS");//如果使用Oracle必须手动添加Schema,判断当前数据库是Oracle 需要手动添加Schema(DBA提供的数据库账号名称)

//如果使用Oracle必须手动添加Schema,判断当前数据库是Oracle 需要手动添加Schema(DBA提供的数据库账号名称)
modelBuilder.HasDefaultSchema("MY");//注意:DBA提供的数据库账号名称,这里的用户:my,密码:123456,用户名必须大写
}

原文地址:https://www.cnblogs.com/1175429393wljblog/p/13792145.html