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