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、第五境界,这个在后面继续更新,貌似这样下去,能够本身写一个框架了。