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、第五境界,這個在後面繼續更新,貌似這樣下去,能夠本身寫一個框架了。

相關文章
相關標籤/搜索