EntityFramework通用DbContext类,支持动态实体模型,多数据库(MySQL,SqlServer,Oracle)
EntityFramework通用DbContext类,支持动态实体模型,多数据库(MySQL,SqlServer,Oracle)
EntityFramework 简介
Entity Framework 的全称为 ADO.NET Entity Framework,简称 EF。
1、与 ADO.NET 的关系
Entity Framework(实体框架)是微软以 ADO.NET 为基础所发展出来的对象关系对应(O/R Mapping)解决方案,早期被称为 ObjectSpace,目前 CodeOnly 功能得到更好的支持,是微软的一个 ORM 框架,其他基于 .NET 开发的 ORM 框架有 Nibernate、PetaPoco 等。
2、Entity Framework 的特点
支持多种数据库(MSSOL、Oracle、Mysql 、SQL Server 和 DB2)
强劲的映射引擎,能很好滴支持储存过程。
提供 Visual Studio 集成工具、可视化操作。
能够与 ASP.NET、WPF、WCF、WCF Data Services 进行很好的集成。
DbContext类
DbContext是实体类和数据库之间的桥梁,DbContext主要负责与数据交互,主要作用:
1、DbContext包含所有的实体映射到数据库表的实体集(DbSet < TEntity >)。
2、DbContext 将LINQ-to-Entities查询转换为SQL查询并将其发送到数据库。
3、更改跟踪: 它跟踪每个实体从数据库中查询出来后发生的修改变化。
4、持久化数据: 它也基于实体状态执行插入、更新和删除操作到数据库中。
DbContext类与数据库交互模型
通用DbContext类 (By C/S框架网)
去掉繁琐的DbSet<>方式定义一堆固定的实体集合,改为采用动态Set<>方式与数据库交互。
C#源码
C# Code:
using System.Data.Common;
using System.Data.Entity;
using System.Linq;
namespace CSFramework.DBEF
{
/// <summary>
/// 通用DbContext类,支持多数据库、支持动态实体模型
/// by: www.csframework.com (C/S框架网)
/// </summary>
public class GenericDbContex : DbContext
{
DbConnection _dbConnection;
DatabaseConfig _databaseConfig;
/// <summary>
/// 构造器
/// </summary>
/// <param name="connection">数据库连接</param>
/// <param name="databaseConfig">数据库配置参数</param>
/// <param name="contextOwnsConnection">由DbContext管理DbConnection实例的关闭与释放内存</param>
public GenericDbContex(DbConnection connection, DatabaseConfig databaseConfig, bool contextOwnsConnection)
: base(connection, contextOwnsConnection)
{
_dbConnection = connection;
_databaseConfig = databaseConfig;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
//重要:动态注册实体类,替换DbSet<>方式
foreach (var T in _databaseConfig.EntityTypes)
modelBuilder.RegisterEntityType(T);
}
/// <summary>
/// 获取查询接口
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="tracking"></param>
/// <returns></returns>
public IQueryable<T> GetQueryable<T>() where T : class
{
return this.Set<T>().AsQueryable<T>();
}
}
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
using System.Data.Entity;
using System.Linq;
namespace CSFramework.DBEF
{
/// <summary>
/// 通用DbContext类,支持多数据库、支持动态实体模型
/// by: www.csframework.com (C/S框架网)
/// </summary>
public class GenericDbContex : DbContext
{
DbConnection _dbConnection;
DatabaseConfig _databaseConfig;
/// <summary>
/// 构造器
/// </summary>
/// <param name="connection">数据库连接</param>
/// <param name="databaseConfig">数据库配置参数</param>
/// <param name="contextOwnsConnection">由DbContext管理DbConnection实例的关闭与释放内存</param>
public GenericDbContex(DbConnection connection, DatabaseConfig databaseConfig, bool contextOwnsConnection)
: base(connection, contextOwnsConnection)
{
_dbConnection = connection;
_databaseConfig = databaseConfig;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
//重要:动态注册实体类,替换DbSet<>方式
foreach (var T in _databaseConfig.EntityTypes)
modelBuilder.RegisterEntityType(T);
}
/// <summary>
/// 获取查询接口
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="tracking"></param>
/// <returns></returns>
public IQueryable<T> GetQueryable<T>() where T : class
{
return this.Set<T>().AsQueryable<T>();
}
}
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
EntityAssemblies.cs
C# Code:
using CSFramework.DBEF.Models;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Reflection;
namespace CSFramework.DBEF.Tester
{
/// <summary>
/// 全局程序集
/// </summary>
public static class EntityAssemblies
{
/// <summary>
/// WebApi框架所有程序集
/// </summary>
public static System.Reflection.Assembly[] Assemblies { get; set; }
/// <summary>
/// 加载程序集
/// </summary>
/// <param name="hostBuilder"></param>
/// <returns></returns>
public static void LoadAssemblies()
{
var T1 = typeof(EntityAssemblies);
var T2 = typeof(Test_Customer);
EntityAssemblies.Assemblies = new System.Reflection.Assembly[]
{
System.Reflection.Assembly.Load("CSFramework.DBEF.Models"),
};
}
private static System.Type[] _AllTypes = null;
/// <summary>
/// 所有类型Types
/// </summary>
public static System.Type[] GetTypes()
{
if (_AllTypes == null)
_AllTypes = Assemblies.SelectMany(m => m.GetTypes()).ToArray();
return _AllTypes;
}
private static System.Type[] _EntityTypes = null;
/// <summary>
/// 所有实体类模型
/// </summary>
/// <returns></returns>
public static System.Type[] GetEntityTypes()
{
if (_EntityTypes == null)
_EntityTypes = GetTypes().Where(x => x.GetCustomAttribute(typeof(TableAttribute), false) != null).ToArray();
return _EntityTypes;
}
}
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Reflection;
namespace CSFramework.DBEF.Tester
{
/// <summary>
/// 全局程序集
/// </summary>
public static class EntityAssemblies
{
/// <summary>
/// WebApi框架所有程序集
/// </summary>
public static System.Reflection.Assembly[] Assemblies { get; set; }
/// <summary>
/// 加载程序集
/// </summary>
/// <param name="hostBuilder"></param>
/// <returns></returns>
public static void LoadAssemblies()
{
var T1 = typeof(EntityAssemblies);
var T2 = typeof(Test_Customer);
EntityAssemblies.Assemblies = new System.Reflection.Assembly[]
{
System.Reflection.Assembly.Load("CSFramework.DBEF.Models"),
};
}
private static System.Type[] _AllTypes = null;
/// <summary>
/// 所有类型Types
/// </summary>
public static System.Type[] GetTypes()
{
if (_AllTypes == null)
_AllTypes = Assemblies.SelectMany(m => m.GetTypes()).ToArray();
return _AllTypes;
}
private static System.Type[] _EntityTypes = null;
/// <summary>
/// 所有实体类模型
/// </summary>
/// <returns></returns>
public static System.Type[] GetEntityTypes()
{
if (_EntityTypes == null)
_EntityTypes = GetTypes().Where(x => x.GetCustomAttribute(typeof(TableAttribute), false) != null).ToArray();
return _EntityTypes;
}
}
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
测试
C# Code:
private void btnTest_Click(object sender, EventArgs e)
{
string connString = ConfigurationManager.ConnectionStrings["TestDB"].ConnectionString.ToString();
var config = new DatabaseConfig
{
DbType = DatabaseType.SqlServer,
AllTypes = EntityAssemblies.GetTypes(),
EntityTypes = EntityAssemblies.GetEntityTypes(),
};
//
//三种常用数据库ADO.NET对象提供者
//SqlClientFactory.Instance
//MySqlConnectorFactory.Instance
//OracleClientFactory.Instance
//
//创建SqlServer数据库
var conn = SqlClientFactory.Instance.CreateConnection();
conn.ConnectionString = connString;
//测试通用DbContext类
using (var db = new GenericDbContex(conn, config, true))
{
//查询
var q = db.GetQueryable<Test_Customer>();
var list = q.Take(10).ToList();
//新增
var customer = NewCustomer();
db.Set<Test_Customer>().Add(customer);
int i = db.SaveChanges();
//删除
var obj = q.Where(w => w.isid == customer.isid).FirstOrDefault();
db.Set<Test_Customer>().Remove(obj);
int x = db.SaveChanges();
//测试事务
var tran = db.Database.BeginTransaction();
try
{
//add
db.Set<Test_Customer>().Add(NewCustomer());
db.Set<Test_Customer>().Add(NewCustomer());
db.Set<Test_Customer>().Add(NewCustomer());
int a = db.SaveChanges();
//edit
var aObj = q.OrderByDescending(o => o.CreationDate).FirstOrDefault();
aObj.NativeName = "修改了客户名称";
aObj.CreationDate = DateTime.Now;
int b = db.SaveChanges();
//delete
var aObj1 = q.OrderBy(o => o.isid).FirstOrDefault();
db.Set<Test_Customer>().Remove(aObj1);
int c = db.SaveChanges();
tran.Commit();
}
catch
{
tran.Rollback();
}
//表示显示最近10条更新的记录
var source = q.OrderByDescending(o => o.CreationDate).Take(10).ToList();
ShowGrid(source);
}
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
private void btnTest_Click(object sender, EventArgs e)
{
string connString = ConfigurationManager.ConnectionStrings["TestDB"].ConnectionString.ToString();
var config = new DatabaseConfig
{
DbType = DatabaseType.SqlServer,
AllTypes = EntityAssemblies.GetTypes(),
EntityTypes = EntityAssemblies.GetEntityTypes(),
};
//
//三种常用数据库ADO.NET对象提供者
//SqlClientFactory.Instance
//MySqlConnectorFactory.Instance
//OracleClientFactory.Instance
//
//创建SqlServer数据库
var conn = SqlClientFactory.Instance.CreateConnection();
conn.ConnectionString = connString;
//测试通用DbContext类
using (var db = new GenericDbContex(conn, config, true))
{
//查询
var q = db.GetQueryable<Test_Customer>();
var list = q.Take(10).ToList();
//新增
var customer = NewCustomer();
db.Set<Test_Customer>().Add(customer);
int i = db.SaveChanges();
//删除
var obj = q.Where(w => w.isid == customer.isid).FirstOrDefault();
db.Set<Test_Customer>().Remove(obj);
int x = db.SaveChanges();
//测试事务
var tran = db.Database.BeginTransaction();
try
{
//add
db.Set<Test_Customer>().Add(NewCustomer());
db.Set<Test_Customer>().Add(NewCustomer());
db.Set<Test_Customer>().Add(NewCustomer());
int a = db.SaveChanges();
//edit
var aObj = q.OrderByDescending(o => o.CreationDate).FirstOrDefault();
aObj.NativeName = "修改了客户名称";
aObj.CreationDate = DateTime.Now;
int b = db.SaveChanges();
//delete
var aObj1 = q.OrderBy(o => o.isid).FirstOrDefault();
db.Set<Test_Customer>().Remove(aObj1);
int c = db.SaveChanges();
tran.Commit();
}
catch
{
tran.Rollback();
}
//表示显示最近10条更新的记录
var source = q.OrderByDescending(o => o.CreationDate).Take(10).ToList();
ShowGrid(source);
}
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
三种常用数据库支持(SqlServer、MySql、Oracle)
三种常用数据库ADO.NET对象提供者,NuGet包:
SqlClientFactory.Instance
MySqlConnectorFactory.Instance
OracleClientFactory.Instance

注: 核心源码提供,其他导致编译失败的源码可自行删除。请关注作者正式发布 CSFramework.DBEF组件。

参考文档:
CSFramework.EF数据库框架|支持多种数据库SqlServer/MySQL/Oracle
CSFramework通用自动提交数据工具类(DbDataUpdate),支持MsSQL,MySQL,Oracle三种数据库
CSFramework.DB基于ADO.NET多数据库底层组件包(MSSQL+Oracle+MySQL)
C#多数据库组件包支持MSSQL+Oracle+MySQL+用户操作手册|C/S框架网
CSFramework框架数据库备份还原操作手册(MySql/Oracle/SqlServer/达梦)|C/S开发框架
CSFrameworkV6软件开发平台主流数据库测试报告(SqlServer/MySql/Oracle/达梦)|C/S开发框架
C# C/S架构软件自动升级程序Winform+多数据库(MySQL,MsSQL,Oracle)-C/S开发框架
C# C/S架构软件自动升级程序Winform+多数据库(MySQL,MsSQL,Oracle)
CSFramework对象模型框架(DbDataUpdate),支持MsSQL,MySQL,Oracle三种数据库操作
EntityFramework入门:配置DbContext以及增、删、改、查、事务操作
CSFramework.WebApi支持多种常用数据库(Mssql/MySQL/Oracle)|C/S开发框架
DbFramework数据库实体类对象模型框架( 支持MsSQL,MySQL,Oracle三种数据库)|C/S开发框架
DbFramework数据库实体类对象模型框架( 支持MsSQL,MySQL,Oracle三种数据库)
C#.NET Winform轻量级UI框架软件快速开发平台(MySQL, Oracle, MsSQL)
企业版V4.0 - 支持MSSQL、MySQL、Oracle三种类型的数据库
最新修改:DAL层支持MySQL/MsSQL/Oracle三种数据库
CSFramework.EF数据库框架|支持多种数据库SqlServer/MySQL/Oracle
CSFramework通用自动提交数据工具类(DbDataUpdate),支持MsSQL,MySQL,Oracle三种数据库
CSFramework.DB基于ADO.NET多数据库底层组件包(MSSQL+Oracle+MySQL)
C#多数据库组件包支持MSSQL+Oracle+MySQL+用户操作手册|C/S框架网
CSFramework框架数据库备份还原操作手册(MySql/Oracle/SqlServer/达梦)|C/S开发框架
CSFrameworkV6软件开发平台主流数据库测试报告(SqlServer/MySql/Oracle/达梦)|C/S开发框架
C# C/S架构软件自动升级程序Winform+多数据库(MySQL,MsSQL,Oracle)-C/S开发框架
C# C/S架构软件自动升级程序Winform+多数据库(MySQL,MsSQL,Oracle)
CSFramework对象模型框架(DbDataUpdate),支持MsSQL,MySQL,Oracle三种数据库操作
EntityFramework入门:配置DbContext以及增、删、改、查、事务操作
CSFramework.WebApi支持多种常用数据库(Mssql/MySQL/Oracle)|C/S开发框架
DbFramework数据库实体类对象模型框架( 支持MsSQL,MySQL,Oracle三种数据库)|C/S开发框架
DbFramework数据库实体类对象模型框架( 支持MsSQL,MySQL,Oracle三种数据库)
C#.NET Winform轻量级UI框架软件快速开发平台(MySQL, Oracle, MsSQL)
企业版V4.0 - 支持MSSQL、MySQL、Oracle三种类型的数据库
最新修改:DAL层支持MySQL/MsSQL/Oracle三种数据库
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
在线客服
