EF Core 填坑记录

EF Core 填坑记录

背景

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

第一层境界

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

  • 一、安装,记得还要安装tool,relational,及sqlserver(若是用的别的数据库,就安装相应的依赖)
  • 二、建立Entity类
  • 三、建立context类:须要作两部分工做,声明DbSet 和 onConfiguring,其中须要声明数据库的链接信息。
  • 四、在controller中直接使用context便可。

简单吧,确实简单,这样比本身去写sql语句要好不少,可是单单是这样仍是有不少问题。数据库

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

来实现:json

第二层境界

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

  • 一、安装Microsoft.Extensions.Configuration
  • 二、建立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();
        }
}
  • 三、将字符串写在“appsettings.json”中,例如:
"ConnectionStrings": {
    "db1": "Server=yourIP,yourPort;Initial Catalog=databaseName;User ID=youeusername;Password=yourpassword"
  }

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

泛型实现通用的增删改查

这里须要对第一层境界的几个地方进行修改,首先,咱们不直接使用dbcontext进行操做了,经过接口来实现,这里就须要加一个接口和接口的实现框架

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

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

好了,完成了。
思路就是这样,可是跑起来,仍是须要再作一些工做,例如咱们要配置数据链接(这个以前已经作了一部分工做了),还须要在操做的时候启动数据链接,执行操做,操做完毕之后还须要关闭数据库,因此咱们还须要在增长一部分工做。函数

前期准备工做:sqlserver

准备工做1

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

  • 一、你要用什么数据库
  • 二、数据库的链接信息
  • 三、绑定你的数据模型

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

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;

至此完成第贰境界。 还有第三,第4、第五境界,这个在后面继续更新,貌似这样下去,能够本身写一个框架了。

相关文章
相关标签/搜索