zoukankan      html  css  js  c++  java
  • EF Core 填坑记录

    EF Core 填坑记录

    背景

    开始学.NET的时候,硬着头皮看的。基本功太差。再后来就是用的别人的框架,一些基本的东西也不是很了解,再回头看的时候,发现好多基本的不是很了解啊,这里接着学习Core,回去填一下坑。

    第一层境界

    就是用。快速的用,那么直接撸好了:

    • 1、安装,记得还要安装tool,relational,及sqlserver(如果用的别的数据库,就安装相应的依赖)
    • 2、创建Entity类
    • 3、创建context类:需要做两部分工作,声明DbSet 和 onConfiguring,其中需要声明数据库的连接信息。
    • 4、在controller中直接使用context即可。

    简单吧,确实简单,这样比自己去写sql语句要好很多,但是单单是这样还是有很多问题。

    第一个问题:数据连接信息硬写在代码里了。你重新发布的时候,就需要代码重新编译。为换个数据连接,重新编译?那你把代码交付以后呢?所以这个不行,需要用configration进行管理。
    第二个问题:需要为每一个entity去写基本的增删改查的操作,很不实用。我们想用泛型来实现通用的方法。

    来实现:

    第二层境界

    使用configuration进行数据连接进行管理

    • 1、安装Microsoft.Extensions.Configuration
    • 2、创建ConfigurationCL类,需要做两个工作:1.声明IConfiguration,2构造函数中,用ConfigurationBuilder构建
    public IConfiguration Configuration { get; set; }
            public ConfigurationCL()
            {
                var builder = new ConfigurationBuilder()
                    .SetBasePath(Directory.GetCurrentDirectory()) 
                    .AddJsonFile("appsettings.json");
    
                   Configuration = builder.Build();
            }
    }
    • 3、将字符串写在“appsettings.json”中,例如:
    
     "ConnectionStrings": {
        "db1": "Server=yourIP,yourPort;Initial Catalog=databaseName;User ID=youeusername;Password=yourpassword"
      }

    用的时候,就直接实例化一个,然后:dbcontext = new DatabaseContext(ConfigurationSL1.Configuration.GetConnectionString(connString));
    第一个问题解决,再来看第二个

    泛型实现通用的增删改查

    这里需要对第一层境界的几个地方进行修改,首先,我们不直接使用dbcontext进行操作了,通过接口来实现,这里就需要加一个接口和接口的实现

    -1 增加一个接口,增加泛型方法

    int Insert<T>(T entity) where T : class;
    • 2、然后在实现类里,实现该方法
     int returnValue = dbcontext.SaveChanges();
                    if(dbTransaction!=null)
                    {
                        dbTransaction.Commit();
                        this.Close();
                    }
                    return returnValue;

    好了,完成了。
    思路就是这样,但是跑起来,还是需要再做一些工作,例如我们要配置数据连接(这个之前已经做了一部分工作了),还需要在操作的时候启动数据连接,执行操作,操作完毕以后还需要关闭数据库,所以我们还需要在增加一部分工作。

    前期准备工作:

    准备工作1

    创建数据库上下文类:此类用来连接数据库和你的项目的数据。说的好像很悬,但是其实最主要的需要完成三个设定

    • 1、你要用什么数据库
    • 2、数据库的连接信息
    • 3、绑定你的数据模型

    看上去是三个,其实实际只需要两个部分代码如下

    public string connString { get; set; }
            public DatabaseContext(string connString)
            {
                this.connString = connString;
            }
    
            protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            {
                optionsBuilder.UseSqlServer(connString);
            }
    
            protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                modelBuilder.Entity<Timu1CL>().ToTable("Timu1CL");
            }

    准备工作二

    把经常需要用到的方法加到接口里,如下:

             DbConnection GetDbConnection();
            IDatabase BeginTrans();
            int Commit();
            void Rollback();
            void Close();

    在实现类里实现

    ConfigurationCL ConfigurationSL1 = new ConfigurationCL();
            public Database(string connString)
            {
                //ConfigurationCL ConfigurationSL1 = new ConfigurationCL();
    
                string objstr = ConfigurationSL1.Configuration.GetConnectionString(connString);
                string connectionString = objstr == null ? connString : objstr;
                dbcontext = new DatabaseContext(connectionString);
            }
    
            public DbContext dbcontext { get; set; }
            //public IDbContextTransaction dbTransaction { get; set; }
    
            public DbTransaction dbTransaction { get; set; }
    
    
          //RelationalConnection
        public DbConnection GetDbConnection()
            {
                return dbcontext.Database.GetDbConnection();
            }
    
            public IDatabase BeginTrans()
            {
                if(dbcontext.Database.GetDbConnection().State==System.Data.ConnectionState.Closed)
                {
                    dbcontext.Database.OpenConnection();
                }
                dbTransaction =(DbTransaction)dbcontext.Database.BeginTransaction();//这里的强制变化不知道行不行。
                dbcontext.Database.UseTransaction(dbTransaction);
    
                return this;
            }
            public int Commit()
            {
                try
                {
                    int returnValue = dbcontext.SaveChanges();
                    if(dbTransaction!=null)
                    {
                        dbTransaction.Commit();
                        this.Close();
                    }
                    return returnValue;
                }
                catch (Exception ex)
                {
                    if (ex.InnerException != null && ex.InnerException.InnerException is SqlException)
                    {
                        SqlException sqlEx = ex.InnerException.InnerException as SqlException;
                        throw ;
                    }
                    throw;
                }
                finally
                {
                    if (dbTransaction == null)
                    {
                        this.Close();
                    }
                }
            }
    
    
            public void Rollback()
            {
                this.dbTransaction.Rollback();
                this.dbTransaction.Dispose();
                this.Close();
            }
            public void Close()
            {
                dbcontext.Dispose();
            }
    
            public int Insert<T>(T entity) where T:class
            {
                dbcontext.Entry<T>(entity).State = EntityState.Added;
                return dbTransaction == null ? this.Commit() : 0;
            }

    完成上面的工作,你需要引用如下:

    using System
    using Microsoft.EntityFrameworkCore;
    using Microsoft.Extensions.Configuration;
    using System.Data.Common;
    using System.Data.SqlClient;

    至此完成第贰境界。
    还有第三,第四、第五境界,这个在后面继续更新,貌似这样下去,可以自己写一个框架了。

  • 相关阅读:
    对象与内存控制1---实例变量和类变量
    数组与内存控制2--数组使用
    数组与内存控制1--数组初始化
    Java 三大特征之--多态
    简述Java面向对象三大特征:封装、继承、多态
    java程序初始化的顺序
    关于public static void main(String[] args)相关知识
    Java的优点
    前端面试攻略3------HTML和CSS部分
    前端面试攻略2------计算机网络部分
  • 原文地址:https://www.cnblogs.com/fighter23/p/11057462.html
Copyright © 2011-2022 走看看