zoukankan      html  css  js  c++  java
  • 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,用户名必须大写
    }

  • 相关阅读:
    数据类型转换:高级向低级转换可能出现的问题和取得不同精度的方法
    Xen Server虚拟机数据恢复的方法和数据恢复过程
    VMware虚拟机误删除vmdk文件后如何恢复?
    MSSQL 2000 错误823恢复
    服务器存储误操作导致数据丢失的恢复过程
    我从业11年来遇到的最奇葩的raid0+1数据恢复经历
    Raid 5数据恢复原理以及raid 5数据恢复实际操作案例
    服务器数据恢复_Linux网站服务器故障数据恢复案例
    Raid5两块硬盘掉线可以恢复数据吗_raid数据恢复案例分享
    V7000存储数据恢复_底层结构原理拆解及Mdisk磁盘掉线数据恢复方法
  • 原文地址:https://www.cnblogs.com/1175429393wljblog/p/13792145.html
Copyright © 2011-2022 走看看