EntityFramework通用DbContext类,支持动态实体模型,多数据库(MySQL,SqlServer,Oracle)
作者:C/S框架网|www.csframewo  发布日期:2022/12/11 23:17:48
  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




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






测试


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




三种常用数据库支持(SqlServer、MySql、Oracle)


三种常用数据库ADO.NET对象提供者,NuGet包:

SqlClientFactory.Instance

MySqlConnectorFactory.Instance

OracleClientFactory.Instance



贴图图片-ef-vs




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








C/S框架网|原创精神.创造价值.打造精品


扫一扫加作者微信
C/S框架网作者微信 C/S框架网|原创作品.质量保障.竭诚为您服务
上一篇 下一篇