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