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;

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

posted @ 2019-06-20 10:59  天空-青岛  阅读(687)  评论(0编辑  收藏  举报