添加应用Microsoft.EntityFrameworkCore;Microsoft.EntityFrameworkCore.Design;Microsoft.EntityFrameworkCore.SqlServer

base类

public abstract partial class BaseEntity
{
/// <summary>
/// id
/// </summary>
public Guid gid { get; set; }
}

分装仓储结构接口

/// <summary>
/// 仓储db接口
/// </summary>
public partial interface IDbContext
{
#region 方法
/// <summary>
/// 创建可用于查询和保存实体实例的DbSet
/// </summary>
/// <typeparam name="TEntity">Entity type</typeparam>
/// <returns>A set for the given entity type</returns>
DbSet<TEntity> Set<TEntity>() where TEntity : BaseEntity; /// <summary>
/// 将在此上下文中所做的所有更改保存到数据库
/// </summary>
/// <returns>The number of state entries written to the database</returns>
int SaveChanges(); /// <summary>
/// 生成一个脚本,为当前模型创建所有表
/// </summary>
/// <returns>A SQL script</returns>
string GenerateCreateScript(); /// <summary>
/// 基于原始SQL查询为查询类型创建LINQ查询
/// </summary>
/// <typeparam name="TQuery">Query type</typeparam>
/// <param name="sql">The raw SQL query</param>
/// <returns>An IQueryable representing the raw SQL query</returns>
IQueryable<TQuery> QueryFromSql<TQuery>(string sql) where TQuery : class; /// <summary>
/// 基于原始SQL查询为实体创建LINQ查询
/// </summary>
/// <typeparam name="TEntity">Entity type</typeparam>
/// <param name="sql">The raw SQL query</param>
/// <param name="parameters">The values to be assigned to parameters</param>
/// <returns>An IQueryable representing the raw SQL query</returns>
IQueryable<TEntity> EntityFromSql<TEntity>(string sql, params object[] parameters) where TEntity : BaseEntity; /// <summary>
/// 对数据库执行给定的SQL
/// </summary>
/// <param name="sql">The SQL to execute</param>
/// <param name="doNotEnsureTransaction">true - the transaction creation is not ensured; false - the transaction creation is ensured.</param>
/// <param name="timeout">The timeout to use for command. Note that the command timeout is distinct from the connection timeout, which is commonly set on the database connection string</param>
/// <param name="parameters">Parameters to use with the SQL</param>
/// <returns>The number of rows affected</returns>
int ExecuteSqlCommand(RawSqlString sql, bool doNotEnsureTransaction = false, int? timeout = null, params object[] parameters); /// <summary>
/// 从上下文中分离一个实体
/// </summary>
/// <typeparam name="TEntity">Entity type</typeparam>
/// <param name="entity">Entity</param>
void Detach<TEntity>(TEntity entity) where TEntity : BaseEntity;
#endregion
}
 /// <summary>
/// 基础仓储接口
/// </summary>
public partial interface IRepository<TEntity> where TEntity : BaseEntity
{
#region 方法
/// <summary>
/// 查询对象
/// </summary>
TEntity GetById(object gid); /// <summary>
/// 添加
/// </summary>
void Insert(TEntity entity); /// <summary>
/// 批量添加
/// </summary>
void Insert(IEnumerable<TEntity> entities); /// <summary>
/// 修改
/// </summary>
void Update(TEntity entity); /// <summary>
/// 批量修改
/// </summary>
void Update(IEnumerable<TEntity> entities); /// <summary>
/// 删除
/// </summary>
void Delete(TEntity entity); /// <summary>
/// 批量删除
/// </summary>
void Delete(IEnumerable<TEntity> entities);
#endregion #region 属性
/// <summary>
/// 查询数据集
/// </summary>
IQueryable<TEntity> Table { get; } /// <summary>
/// 获取一个启用“no tracking”(EF特性)的表,仅当您仅为只读操作加载记录时才使用它
/// </summary>
IQueryable<TEntity> TableNoTracking { get; }
#endregion
}
/// <summary>
/// 基础仓储实现
/// </summary>
public partial class EfRepository<TEntity> : IRepository<TEntity> where TEntity : BaseEntity
{
#region 参数
private readonly IDbContext _context;
private DbSet<TEntity> _entities;
#endregion #region 构造函数
public EfRepository(IDbContext context)
{
this._context = context;
}
#endregion #region 公共方法
/// <summary>
/// 实体更改的回滚并返回完整的错误消息
/// </summary>
/// <param name="exception">Exception</param>
/// <returns>Error message</returns>
protected string GetFullErrorTextAndRollbackEntityChanges(DbUpdateException exception)
{
//回滚实体
if (_context is DbContext dbContext)
{
var entries = dbContext.ChangeTracker.Entries()
.Where(e => e.State == EntityState.Added || e.State == EntityState.Modified).ToList(); entries.ForEach(entry => entry.State = EntityState.Unchanged);
}
_context.SaveChanges();
return exception.ToString();
}
#endregion #region 方法
/// <summary>
/// 按id获取实体
/// </summary>
/// <param name="id">Identifier</param>
/// <returns>Entity</returns>
public virtual TEntity GetById(object id)
{
return Entities.Find(id);
} /// <summary>
/// 添加
/// </summary>
/// <param name="entity">Entity</param>
public virtual void Insert(TEntity entity)
{
if (entity == null)
throw new ArgumentNullException(nameof(entity)); try
{
Entities.Add(entity);
_context.SaveChanges();
}
catch (DbUpdateException exception)
{
//ensure that the detailed error text is saved in the Log
throw new Exception(GetFullErrorTextAndRollbackEntityChanges(exception), exception);
}
} /// <summary>
/// 批量添加
/// </summary>
/// <param name="entities">Entities</param>
public virtual void Insert(IEnumerable<TEntity> entities)
{
if (entities == null)
throw new ArgumentNullException(nameof(entities)); try
{
Entities.AddRange(entities);
_context.SaveChanges();
}
catch (DbUpdateException exception)
{
//ensure that the detailed error text is saved in the Log
throw new Exception(GetFullErrorTextAndRollbackEntityChanges(exception), exception);
}
} /// <summary>
/// 修改
/// </summary>
/// <param name="entity">Entity</param>
public virtual void Update(TEntity entity)
{
if (entity == null)
throw new ArgumentNullException(nameof(entity)); try
{
Entities.Update(entity);
_context.SaveChanges();
}
catch (DbUpdateException exception)
{
//ensure that the detailed error text is saved in the Log
throw new Exception(GetFullErrorTextAndRollbackEntityChanges(exception), exception);
}
} /// <summary>
/// 批量修改
/// </summary>
/// <param name="entities">Entities</param>
public virtual void Update(IEnumerable<TEntity> entities)
{
if (entities == null)
throw new ArgumentNullException(nameof(entities)); try
{
Entities.UpdateRange(entities);
_context.SaveChanges();
}
catch (DbUpdateException exception)
{
//ensure that the detailed error text is saved in the Log
throw new Exception(GetFullErrorTextAndRollbackEntityChanges(exception), exception);
}
} /// <summary>
/// 删除
/// </summary>
/// <param name="entity">Entity</param>
public virtual void Delete(TEntity entity)
{
if (entity == null)
throw new ArgumentNullException(nameof(entity)); try
{
Entities.Remove(entity);
_context.SaveChanges();
}
catch (DbUpdateException exception)
{
//ensure that the detailed error text is saved in the Log
throw new Exception(GetFullErrorTextAndRollbackEntityChanges(exception), exception);
}
} /// <summary>
/// 批量删除
/// </summary>
/// <param name="entities">Entities</param>
public virtual void Delete(IEnumerable<TEntity> entities)
{
if (entities == null)
throw new ArgumentNullException(nameof(entities)); try
{
Entities.RemoveRange(entities);
_context.SaveChanges();
}
catch (DbUpdateException exception)
{
//ensure that the detailed error text is saved in the Log
throw new Exception(GetFullErrorTextAndRollbackEntityChanges(exception), exception);
}
} #endregion #region 属性
/// <summary>
/// 获取表
/// </summary>
public virtual IQueryable<TEntity> Table => Entities; /// <summary>
/// 获取一个启用“no tracking”(EF特性)的表,仅当您仅为只读操作加载记录时才使用它
/// </summary>
public virtual IQueryable<TEntity> TableNoTracking => Entities.AsNoTracking(); /// <summary>
/// 获取设置模板
/// </summary>
protected virtual DbSet<TEntity> Entities
{
get
{
if (_entities == null)
_entities = _context.Set<TEntity>(); return _entities;
}
}
#endregion
}

ef的模型映射封装

 /// <summary>
/// 表示数据库上下文模型映射配置
/// </summary>
public partial interface IMappingConfiguration
{
/// <summary>
/// 应用此映射配置
/// </summary>
/// <param name="modelBuilder">用于构造数据库上下文模型的生成器</param>
void ApplyConfiguration(ModelBuilder modelBuilder);
}
/// <summary>
/// 表示基本实体映射配置
/// </summary>
/// <typeparam name="TEntity">Entity type</typeparam>
public partial class NopEntityTypeConfiguration<TEntity> : IMappingConfiguration, IEntityTypeConfiguration<TEntity> where TEntity : BaseEntity
{
#region Utilities
/// <summary>
/// Developers can override this method in custom partial classes in order to add some custom configuration code
/// </summary>
/// <param name="builder">The builder to be used to configure the entity</param>
protected virtual void PostConfigure(EntityTypeBuilder<TEntity> builder)
{
}
#endregion #region Methods
/// <summary>
/// Configures the entity
/// </summary>
/// <param name="builder">The builder to be used to configure the entity</param>
public virtual void Configure(EntityTypeBuilder<TEntity> builder)
{
//add custom configuration
this.PostConfigure(builder);
} /// <summary>
/// Apply this mapping configuration
/// </summary>
/// <param name="modelBuilder">The builder being used to construct the model for the database context</param>
public virtual void ApplyConfiguration(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfiguration(this);
}
#endregion
}
/// <summary>
/// 表示基本EF对象上下文
/// </summary>
public partial class NopObjectContext : DbContext, IDbContext
{
#region 构造函数
public NopObjectContext(DbContextOptions<NopObjectContext> options) : base(options)
{
}
#endregion #region 公共方法
/// <summary>
/// 进一步配置注册映射模型
/// </summary>
/// <param name="modelBuilder">用于为该上下文构造模型的构造器</param>
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//动态加载所有实体和查询类型配置
var typeConfigurations = Assembly.GetExecutingAssembly().GetTypes().Where(type =>
(type.BaseType?.IsGenericType ?? false)
&& (type.BaseType.GetGenericTypeDefinition() == typeof(NopEntityTypeConfiguration<>))); foreach (var typeConfiguration in typeConfigurations)
{
var configuration = (IMappingConfiguration)Activator.CreateInstance(typeConfiguration);
configuration.ApplyConfiguration(modelBuilder);
} base.OnModelCreating(modelBuilder);
} /// <summary>
/// 通过添加传递的参数来修改输入SQL查询
/// </summary>
/// <param name="sql">The raw SQL query</param>
/// <param name="parameters">The values to be assigned to parameters</param>
/// <returns>Modified raw SQL query</returns>
protected virtual string CreateSqlWithParameters(string sql, params object[] parameters)
{
//add parameters to sql
for (var i = ; i <= (parameters?.Length ?? ) - ; i++)
{
if (!(parameters[i] is DbParameter parameter))
continue; sql = $"{sql}{(i > 0 ? "," : string.Empty)} @{parameter.ParameterName}"; //whether parameter is output
if (parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Output)
sql = $"{sql} output";
} return sql;
}
#endregion #region 方法
/// <summary>
/// 创建可用于查询和保存实体实例的DbSet
/// </summary>
/// <typeparam name="TEntity">Entity type</typeparam>
/// <returns>A set for the given entity type</returns>
public virtual new DbSet<TEntity> Set<TEntity>() where TEntity : BaseEntity
{
return base.Set<TEntity>();
} /// <summary>
/// 生成一个脚本,为当前模型创建所有表
/// </summary>
/// <returns>A SQL script</returns>
public virtual string GenerateCreateScript()
{
return this.Database.GenerateCreateScript();
} /// <summary>
/// 基于原始SQL查询为查询类型创建LINQ查询
/// </summary>
/// <typeparam name="TQuery">Query type</typeparam>
/// <param name="sql">The raw SQL query</param>
/// <returns>An IQueryable representing the raw SQL query</returns>
public virtual IQueryable<TQuery> QueryFromSql<TQuery>(string sql) where TQuery : class
{
return this.Query<TQuery>().FromSql(sql);
} /// <summary>
///基于原始SQL查询为实体创建LINQ查询
/// </summary>
/// <typeparam name="TEntity">Entity type</typeparam>
/// <param name="sql">The raw SQL query</param>
/// <param name="parameters">The values to be assigned to parameters</param>
/// <returns>An IQueryable representing the raw SQL query</returns>
public virtual IQueryable<TEntity> EntityFromSql<TEntity>(string sql, params object[] parameters) where TEntity : BaseEntity
{
return this.Set<TEntity>().FromSql(CreateSqlWithParameters(sql, parameters), parameters);
} /// <summary>
/// 对数据库执行给定的SQL
/// </summary>
/// <param name="sql">The SQL to execute</param>
/// <param name="doNotEnsureTransaction">true - the transaction creation is not ensured; false - the transaction creation is ensured.</param>
/// <param name="timeout">The timeout to use for command. Note that the command timeout is distinct from the connection timeout, which is commonly set on the database connection string</param>
/// <param name="parameters">Parameters to use with the SQL</param>
/// <returns>The number of rows affected</returns>
public virtual int ExecuteSqlCommand(RawSqlString sql, bool doNotEnsureTransaction = false, int? timeout = null, params object[] parameters)
{
//set specific command timeout
var previousTimeout = this.Database.GetCommandTimeout();
this.Database.SetCommandTimeout(timeout); var result = ;
if (!doNotEnsureTransaction)
{
//use with transaction
using (var transaction = this.Database.BeginTransaction())
{
result = this.Database.ExecuteSqlCommand(sql, parameters);
transaction.Commit();
}
}
else
result = this.Database.ExecuteSqlCommand(sql, parameters); //return previous timeout back
this.Database.SetCommandTimeout(previousTimeout); return result;
} /// <summary>
/// 从上下文中分离一个实体
/// </summary>
/// <typeparam name="TEntity">Entity type</typeparam>
/// <param name="entity">Entity</param>
public virtual void Detach<TEntity>(TEntity entity) where TEntity : BaseEntity
{
if (entity == null)
throw new ArgumentNullException(nameof(entity)); var entityEntry = this.Entry(entity);
if (entityEntry == null)
return; //set the entity is not being tracked by the context
entityEntry.State = EntityState.Detached;
}
#endregion
}

代码都是从nop开源项目出抠出来的

IOC+EF+Core项目搭建EF封装(一)的更多相关文章

  1. IOC+EF+Core项目搭建IOC注入及框架(二)

    配置ServiceCollection /// <summary> /// 表示IServiceCollection的扩展 /// </summary> public stat ...

  2. Asp.net Core + EF Core + Bootstrap搭建的MVC后台通用管理系统模板(跨平台版本)

    Asp.net Core + EF Core + Bootstrap搭建的MVC后台通用管理系统模板(跨平台版本) 原创 2016年07月22日 10:33:51 23125 6月随着.NET COR ...

  3. EF Core 快速上手——EF Core 入门

    EF Core 快速上手--EF Core 介绍 本章导航 从本书你能学到什么 对EF6.x 程序员的一些话 EF Core 概述 1.3.1 ORM框架的缺点 第一个EF Core应用   本文是对 ...

  4. ASP.NET CORE 项目搭建(2022 年 3 月版)

    ASP.NET CORE 项目搭建(2022 年 3 月版) 自读 沉淀了多年的技术积累,在 .NET FRAMEWORK 的框架下尝试造过自己的轮子. 摸索着闭门造过 基于 OWIN 服务后端. 摸 ...

  5. EF Core 快速上手——EF Core的三种主要关系类型

    系列文章 EF Core 快速上手--EF Core 入门 本节导航 三种数据库关系类型建模 Migration方式创建和习修改数据库 定义和创建应用DbContext 将复杂查询拆分为子查询   本 ...

  6. ASP.NET Core MVC+EF Core项目实战

    项目背景 本项目参考于<Pro Entity Framework Core 2 for ASP.NET Core MVC>一书,项目内容为party邀请答复. 新建项目 本项目开发工具为V ...

  7. EF Core 三 、 EF Core CRUD

    EF Core CRUD 上篇文章中,我们已经基本入门了EFCore,搭建了一个简单的EFCore项目,本文开始简单使用下EF,做增删改查的相关操作: 一.数据新增操作(C) public stati ...

  8. 《Asp.Net Core3 + Vue3入坑教程》-Net Core项目搭建与Swagger配置步骤

    简介 <Asp.Net Core3 + Vue3入坑教程> 此教程仅适合新手入门或者前后端分离尝试者.可以根据图文一步一步进操作编码也可以选择直接查看源码.每一篇文章都有对应的源码 教程后 ...

  9. EF Core 迁移过程遇到EF Core tools version版本不相符的解决方案

    如果你使用命令: PM> add-migration Inital 提示如下信息时: The EF Core tools version '2.1.1-rtm-30846' is older t ...

随机推荐

  1. mapreduce数据处理——统计排序

    接上篇https://www.cnblogs.com/sengzhao666/p/11850849.html 2.数据处理: ·统计最受欢迎的视频/文章的Top10访问次数 (id) ·按照地市统计最 ...

  2. Vue2.0 render: h => h(App)的解释

    render: h => h(App)是ES6的写法,其实就是如下内容的简写: render: function (createElement) { return createElement(A ...

  3. if, if/else, if /elif/else,case

    一.if语句用法 if expression then command fi 例子:使用整数比较运算符 read -p "please input a integer:" a if ...

  4. android -------- DES加密解密算法

    DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信 ...

  5. 微信小程序开发——使用第三方插件生成二维码

    需求场景: 小程序中指定页面需要根据列表数据生成多张二维码. 实现方案: 鉴于需要生成多张二维码,可以将生成二维码的功能封装到组件中,直接在页面列表循环中调用就好了.也可以给组件添加slot,在页面调 ...

  6. Python3基础 yield StopIteration.value获取函数的返回值

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  7. 【原创】MongoDB安装配置详解(标注两个坑)

    1.下载安装 3.4正式版([坑]不要最新版,有可能进度卡在这个位置不动,等了半个小时也没什么反映,) http://downloads.mongodb.org/win32/mongodb-win32 ...

  8. 两种Redis持久化原理的详解

    Redis为持久化提供了两种方式: RDB:在指定的时间间隔能对你的数据进行快照存储. AOF:记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据. 本文将通过下面内容的介 ...

  9. [LeetCode] 535. Encode and Decode TinyURL 编码和解码短网址

    Note: This is a companion problem to the System Design problem: Design TinyURL. TinyURL is a URL sho ...

  10. openstack 权限控制 (添加自定义角色)keystone等组件

    每一个平台.系统都会对于用户的权限进行严格的管理与控制. openstack是一个开源的项目,我们可以直接下载其源码,进行更改以达到我们的要求. 这里只是针对于用户的权限进行管理,以keystone: ...