using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Core.Objects;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.Migrations;
using System.Data.Entity.Validation;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using EntityFramework.Extensions;
using System.Threading.Tasks;
//using log4net;
//using log4net.Core; namespace _6._0Test
{
/// <summary>
/// 上下文静态实体类
/// </summary>
public static class DbContentEntity
{
/// <summary>
/// 静态初始化
/// </summary>
static DbContentEntity()
{
if (string.IsNullOrEmpty(ConnectionString))
return;
if (_entities == null)
{
_entities = new TestEntities(ConnectionString);
_entities.Configuration.ValidateOnSaveEnabled = false;
}
if (_entities.Database.Connection.State == ConnectionState.Closed && _entities.Database.Connection.State != ConnectionState.Connecting)
{
_entities.Database.Connection.Open();
}
} /// <summary>
/// 静态连接字符串
/// </summary> public static string ConnectionString
{
get { return ConfigurationManager.ConnectionStrings["TestEntities"].ConnectionString; }
} /// <summary>
/// 静态实体
/// </summary>
private static TestEntities _entities;
/// <summary>
/// 对外实体
/// </summary>
public static TestEntities Entities
{
get
{
if (string.IsNullOrEmpty(ConnectionString))
return null;
return _entities ?? (_entities = new TestEntities(ConnectionString));
}
} } /// <summary>
/// 上下文类
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class ModelContext<T> where T : class
{
//日志,可自行拓展
//public static ILog Log = LogManager.GetLogger(typeof(T).Name); /// <summary>
/// 返回上下文实体
/// </summary>
protected TestEntities Entities
{
get { return DbContentEntity.Entities; }
} private DbSet<T> _model; protected DbSet<T> Model
{
get { return _model ?? (_model = Entities.Set<T>()); }
} #region =====查询用方法===== /// <summary>
/// 根据条件查询实体
/// </summary>
/// <param name="where">条件</param>
/// <returns>实体</returns>
public virtual T Get(Expression<Func<T, bool>> @where)
{ return Model.FirstOrDefault(where); } /// <summary>
/// 根据条件查询实体(异步)
/// </summary>
/// <param name="where">条件</param>
/// <returns>实体</returns>
public async virtual Task<T> GetAsync(Expression<Func<T, bool>> @where)
{ return await Model.FirstOrDefaultAsync(where); } /// <summary>
/// 根据条件查询实体集合(需自行tolist,自行异步)
/// </summary>
/// <param name="where">查询条件</param>
/// <returns></returns>
public virtual IQueryable<T> GetList(Expression<Func<T, bool>> @where)
{ return Model.AsNoTracking().Where(where); } /// <summary>
/// 根据条件查询实体集合(需自行tolist,自行异步)
/// </summary>
/// <param name="where">查询条件</param>
/// <returns></returns>
public async virtual Task<IQueryable<T>> GetListAsync(Expression<Func<T, bool>> @where)
{ return await Task.Run(()=>Model.AsNoTracking().Where(where)); } /// <summary>
/// 根据传进来的实体类型查询该实体的集合
/// </summary>
/// <typeparam name="TM">实体类型</typeparam>
/// <param name="where">查询条件</param>
/// <returns></returns>
public virtual IQueryable<TM> GetList<TM>(Expression<Func<TM, bool>> @where) where TM : class
{ var model = Entities.Set<TM>();
return model.AsNoTracking().Where(where); }
/// <summary>
/// 根据传进来的实体类型查询该实体(异步)
/// </summary>
/// <typeparam name="TM">实体类型</typeparam>
/// <param name="where">查询条件</param>
/// <returns></returns>
public async virtual Task<TM> GetAsync<TM>(Expression<Func<TM, bool>> @where) where TM : class
{ var model = Entities.Set<TM>();
return await model.FirstOrDefaultAsync(where); } /// <summary>
/// 根据条件查询实体数量
/// </summary>
/// <typeparam name="TM">实体类型</typeparam>
/// <param name="where">查询条件</param>
/// <returns></returns>
public virtual int Cout<TM>(Expression<Func<TM, bool>> @where) where TM : class
{
try
{
var model = Entities.Set<TM>();
return model.AsNoTracking().Count(where);
}
catch (DbEntityValidationException dbEx)
{
//Log.Error(dbEx + dbEx.Message);
return -;
}
catch (Exception ex)
{
//Log.Error(ex + ex.Message);
return -;
}
} /// <summary>
/// 根据条件查询实体数量(异步)
/// </summary>
/// <typeparam name="TM">实体类型</typeparam>
/// <param name="where">查询条件</param>
/// <returns></returns>
public async virtual Task<int> CoutAsync<TM>(Expression<Func<TM, bool>> @where) where TM : class
{
try
{
var model = Entities.Set<TM>();
return await model.AsNoTracking().CountAsync(where);
}
catch (DbEntityValidationException dbEx)
{
//Log.Error(dbEx + dbEx.Message);
return -;
}
catch (Exception ex)
{
//Log.Error(ex + ex.Message);
return -;
}
}
/// <summary>
/// 根据条件查询实体数量
/// </summary>
/// <param name="where"></param>
/// <returns></returns>
public async virtual Task<int> Count(Expression<Func<T, bool>> @where)
{
try
{
var model = Entities.Set<T>();
return await model.AsNoTracking().CountAsync(where);
}
catch (DbEntityValidationException dbEx)
{
//Log.Error(dbEx + dbEx.Message);
return -;
}
catch (Exception ex)
{
//Log.Error(ex + ex.Message);
return -;
}
} #endregion #region ====添加用方法====
/// <summary>
/// 添加实体
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
public virtual bool Add(T m)
{
try
{ Model.Add(m);
Entities.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
//Log.Error(dbEx + dbEx.Message);
return false;
}
catch (Exception ex)
{
//Log.Error(ex + ex.Message);
return false;
}
return true;
}
/// <summary>
/// 添加实体(异步)
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
public async virtual Task<bool> AddAsync(T m)
{
try
{ Model.Add(m);
await Entities.SaveChangesAsync();
}
catch (DbEntityValidationException dbEx)
{
//Log.Error(dbEx + dbEx.Message);
return false;
}
catch (Exception ex)
{
//Log.Error(ex + ex.Message);
return false;
}
return true;
} /// <summary>
/// 根据类型添加实体
/// </summary>
/// <typeparam name="TM"></typeparam>
/// <param name="tm"></param>
/// <returns></returns>
public virtual bool Add<TM>(TM tm) where TM : class
{
try
{
var model = Entities.Set<TM>();
model.Add(tm);
Entities.SaveChanges();
}
catch (DbEntityValidationException dbex)
{
//Log.Error(dbex + dbex.Message);
return false;
}
catch (Exception ex)
{
//Log.Error(ex + ex.Message);
return false;
}
return true;
} /// <summary>
/// 批量添加实体
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
public virtual bool AddRange(IEnumerable<T> m)
{ try
{
Model.AddRange(m);
Entities.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
//Log.Error(dbEx + dbEx.Message);
return false;
}
catch (Exception ex)
{
//Log.Error(ex + ex.Message);
return false;
}
return true;
}
/// <summary>
/// 批量添加实体(异步)
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
public async virtual Task<bool> AddRangeAsync(IEnumerable<T> m)
{ try
{
Model.AddRange(m);
await Entities.SaveChangesAsync();
}
catch (DbEntityValidationException dbEx)
{
//Log.Error(dbEx + dbEx.Message);
return false;
}
catch (Exception ex)
{
//Log.Error(ex + ex.Message);
return false;
}
return true;
} #endregion #region ====修改用方法====
/// <summary>
/// 修改实体
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public virtual bool Update(T t)
{ try
{ Model.Attach(t);
Entities.Entry(t).State = EntityState.Modified;
Entities.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
//Log.Error(dbEx + dbEx.Message);
return false;
}
catch (Exception ex)
{
//Log.Error(ex + ex.Message);
return false;
}
return true;
} /// <summary>
/// 修改实体(异步)
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public async virtual Task<bool> UpdateAsync(T t)
{ try
{ Model.Attach(t);
Entities.Entry(t).State = EntityState.Modified;
await Entities.SaveChangesAsync();
}
catch (DbEntityValidationException dbEx)
{
//Log.Error(dbEx + dbEx.Message);
return false;
}
catch (Exception ex)
{
//Log.Error(ex + ex.Message);
return false;
}
return true;
}
/// <summary>
/// 根据类型修改实体
/// </summary>
/// <typeparam name="TM"></typeparam>
/// <param name="tm"></param>
/// <returns></returns>
public virtual bool Update<TM>(TM tm) where TM : class
{
try
{
var model = Entities.Set<TM>();
model.Attach(tm);
Entities.Entry(tm).State = EntityState.Modified;
Entities.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
//Log.Error(dbEx + dbEx.Message);
return false;
}
catch (Exception ex)
{
//Log.Error(ex + ex.Message);
return false;
}
return true;
} /// <summary>
/// 批量更新数据
/// </summary>
/// <param name="where">更新数据的条件 如:u => u.FirstName == "firstname"</param>
/// <param name="ex">更新的值 如:u=>new User{FirstName = "newfirstname"}</param>
/// <returns>返回影响的条数</returns>
public virtual int Update(Expression<Func<T, bool>> @where, Expression<Func<T, T>> ex)
{
try
{
return Model.Where(where).Update(ex);
}
catch (DbEntityValidationException dbEx)
{
//Log.Error(dbEx + dbEx.Message);
return -;
}
catch (Exception e)
{
// Log.Error(e + e.Message);
return -;
}
} /// <summary>
/// 批量更新数据(异步)
/// </summary>
/// <param name="where">更新数据的条件 如:u => u.FirstName == "firstname"</param>
/// <param name="ex">更新的值 如:u=>new User{FirstName = "newfirstname"}</param>
/// <returns>返回影响的条数</returns>
public async virtual Task<int> UpdateAsync(Expression<Func<T, bool>> @where, Expression<Func<T, T>> ex)
{
try
{
return await Model.Where(where).UpdateAsync(ex);
}
catch (DbEntityValidationException dbEx)
{
//Log.Error(dbEx + dbEx.Message);
return -;
}
catch (Exception e)
{
// Log.Error(e + e.Message);
return -;
}
} /// <summary>
/// 添加或者修改实体(无则添加,有则修改)
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
public virtual bool AddOrUpdate(T[] m)
{
try
{
Model.AddOrUpdate(m);
Entities.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
// Log.Error(dbEx + dbEx.Message);
return false;
}
catch (Exception ex)
{
//Log.Error(ex + ex.Message);
return false;
}
return true;
} /// <summary>
/// 添加或者修改实体(无则添加,有则修改,异步)
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
public async virtual Task<bool> AddOrUpdateAsync(T[] m)
{
try
{
Model.AddOrUpdate(m);
await Entities.SaveChangesAsync();
}
catch (DbEntityValidationException dbEx)
{
// Log.Error(dbEx + dbEx.Message);
return false;
}
catch (Exception ex)
{
//Log.Error(ex + ex.Message);
return false;
}
return true;
} #endregion #region ===事务====
/// <summary>
/// 运行基本事务,返回bool值
/// </summary>
/// <param name="model"></param>
/// <returns></returns> protected bool RunTransaction(Action<DbSet<T>> model)
{ using (var transaction = Entities.Database.BeginTransaction())
{
try
{
model.Invoke(Model);
Entities.SaveChanges();
transaction.Commit();
return true;
}
catch (DbEntityValidationException dbEx)
{
//Log.Error("EXEC RunTransaction Error:" + dbEx + dbEx.Message);
return false;
}
catch (Exception ex)
{
//Log.Error("EXEC RunTransaction Error:" + ex + ex.Message);
transaction.Rollback();
return false; }
} }
/// <summary>
/// 运行基本事务,返回bool值(异步)
/// </summary>
/// <param name="model"></param>
/// <returns></returns> protected async Task<bool> RunTransactionAsync(Action<DbSet<T>> model)
{ using (var transaction = Entities.Database.BeginTransaction())
{
try
{
model.Invoke(Model);
await Entities.SaveChangesAsync();
transaction.Commit();
return true;
}
catch (DbEntityValidationException dbEx)
{
//Log.Error("EXEC RunTransaction Error:" + dbEx + dbEx.Message);
return false;
}
catch (Exception ex)
{
//Log.Error("EXEC RunTransaction Error:" + ex + ex.Message);
transaction.Rollback();
return false; }
} }
#endregion #region======删除用方法====
/// <summary>
/// 删除实体
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public virtual bool Remove(T t)
{
try
{
Model.Remove(t);
Entities.SaveChanges(); }
catch (DbEntityValidationException dbEx)
{
//Log.Error(dbEx + dbEx.Message);
return false;
}
catch (Exception ex)
{
//Log.Error(ex + ex.Message);
return false;
}
return true; } /// <summary>
/// 删除实体(异步)
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public async virtual Task<bool> RemoveAsync(T t)
{
try
{
Model.Remove(t);
await Entities.SaveChangesAsync(); }
catch (DbEntityValidationException dbEx)
{
//Log.Error(dbEx + dbEx.Message);
return false;
}
catch (Exception ex)
{
//Log.Error(ex + ex.Message);
return false;
}
return true; } /// <summary>
/// 根据类型删除实体
/// </summary>
/// <typeparam name="TM"></typeparam>
/// <param name="m"></param>
/// <returns></returns>
public virtual bool Remove<TM>(TM m) where TM : class
{
try
{
var model = Entities.Set<TM>();
model.Remove(m);
Entities.SaveChanges(); }
catch (DbEntityValidationException dbEx)
{
//Log.Error(dbEx + dbEx.Message);
return false;
}
catch (Exception ex)
{
//Log.Error(ex + ex.Message);
return false;
}
return true;
} /// <summary>
///批量删除实体
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
public virtual int RemoveRange(IEnumerable<T> m)
{ try
{
Model.RemoveRange(m);
return Entities.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
//Log.Error(dbEx + dbEx.Message);
return -;
}
catch (Exception ex)
{
//Log.Error(ex + ex.Message);
return -;
} } /// <summary>
///批量删除实体(异步)
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
public async virtual Task<int> RemoveRangeAsync(IEnumerable<T> m)
{ try
{
Model.RemoveRange(m);
return await Entities.SaveChangesAsync();
}
catch (DbEntityValidationException dbEx)
{
//Log.Error(dbEx + dbEx.Message);
return -;
}
catch (Exception ex)
{
//Log.Error(ex + ex.Message);
return -;
} } /// <summary>
/// 根据类型批量删除实体
/// </summary>
/// <typeparam name="TM"></typeparam>
/// <param name="tmMs"></param>
/// <returns></returns>
public virtual int RemoveRange<TM>(IEnumerable<TM> tmMs) where TM : class
{
try
{
var model = Entities.Set<TM>();
model.RemoveRange(tmMs);
return Entities.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
//Log.Error(dbEx + dbEx.Message);
return -;
}
catch (Exception ex)
{
//Log.Error(ex + ex.Message);
return -; } }
#endregion } }

..求大神指点一下..哪里有问题..我在改改..

自己封装了一个EF的上下文类.,分享一下,顺便求大神指点的更多相关文章

  1. PHP封装的一个单例模式Mysql操作类

    掌握满足单例模式的必要条件----三私一公. ①私有的构造方法-为了防止在类外使用new关键字实例化对象. ②私有的成员属性-为了防止在类外引入这个存放对象的属性. ③私有的克隆方法-为了防止在类外通 ...

  2. 线段树总结 (转载 里面有扫描线类 还有NotOnlySuccess线段树大神的地址)

    转载自:http://blog.csdn.net/shiqi_614/article/details/8228102 之前做了些线段树相关的题目,开学一段时间后,想着把它整理下,完成了大牛NotOnl ...

  3. #String类简述(小白理解,小白编写,欢迎大神指点,小白跪谢)

    @ 目录 一.前言(可忽略) 二.String变量的认知 三.String类的构造方法 四.String类的基本方法 4.1 toString()方法 4.2 equals()方法 4.3 equal ...

  4. php 自制简单路由类 望大神指点

    class route{ /** @var null 模块 */ private static $module = null; /** @var null 控制器 */ private static ...

  5. EF 请求数据是缓存 求大神解释

    // //AliexpressEntities MyaliexpressEntities 为了事物一致性 在别的方法里面传过来的 实质还是 (  AliexpressEntities aliexpre ...

  6. 14.翻译系列:从已经存在的数据库中生成上下文类和实体类【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/code-first-from-existing-database.aspx EF 6 ...

  7. 5.翻译:EF基础系列---EF中的上下文类

    原文地址:http://www.entityframeworktutorial.net/basics/context-class-in-entity-framework.aspx EF中的上下文类是一 ...

  8. 基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil

    基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil,把日常能用到的各种CRUD都进行了简化封装,让普通程序员只需关注业务即可,因为非常简单,故直接贴源代码,大家若需使用可以直 ...

  9. Timber(对Log类封装的一个工具)

    Timber(对Log类封装的一个工具) https://blog.csdn.net/hzl9966/article/details/51314137 https://www.jianshu.com/ ...

随机推荐

  1. 移动先行之谁主沉浮? 带着你的Net飞奔吧!

    移动系源码:https://github.com/dunitian/Windows10 移动系文档:https://github.com/dunitian/LoTDotNet/tree/master/ ...

  2. nginx的使用

    1.nginx的下载 解压后文件目录: 2.nginx的常用命令 nginx -s stop 强制关闭  nginx -s quit 安全关闭  nginx -s reload 改变配置文件的时候,重 ...

  3. 神马玩意,EntityFramework Core 1.1又更新了?走,赶紧去围观

    前言 哦,不搞SQL了么,当然会继续,周末会继续更新,估计写完还得几十篇,但是我会坚持把SQL更新完毕,绝不会烂尾,后续很长一段时间没更新的话,不要想我,那说明我是学习新的技能去了,那就是学习英语,本 ...

  4. 代码的坏味道(20)——过度耦合的消息链(Message Chains)

    坏味道--过度耦合的消息链(Message Chains) 特征 消息链的形式类似于:obj.getA().getB().getC(). 问题原因 如果你看到用户向一个对象请求另一个对象,然后再向后者 ...

  5. Asp.Net Core + Dapper + Repository 模式 + TDD 学习笔记

    0x00 前言 之前一直使用的是 EF ,做了一个简单的小项目后发现 EF 的表现并不是很好,就比如联表查询,因为现在的 EF Core 也没有啥好用的分析工具,所以也不知道该怎么写 Linq 生成出 ...

  6. 通过自定义特性,使用EF6拦截器完成创建人、创建时间、更新人、更新时间的统一赋值(使用数据库服务器时间赋值,接上一篇)

    目录: 前言 设计(完成扩展) 实现效果 扩展设计方案 扩展后代码结构 集思广益(问题) 前言: 在上一篇文章我写了如何重建IDbCommandTreeInterceptor来实现创建人.创建时间.更 ...

  7. 当我们在谈论kmeans(1)

    本稿为初稿,后续可能还会修改:如果转载,请务必保留源地址,非常感谢! 博客园:http://www.cnblogs.com/data-miner/ 简书:建设中... 知乎:建设中... 当我们在谈论 ...

  8. innodb 自增列重复值问题

    1 innodb 自增列出现重复值的问题 先从问题入手,重现下这个bug use test; drop table t1; create table t1(id int auto_increment, ...

  9. 一种简单的CQRS架构设计及其实现

    一.为什么要实践领域驱动? 近一年时间我一直在思考一个问题:"如何设计一个松耦合.高伸缩性.易于维护的架构?".之所以有这样的想法是因为我接触的不少项目都是以数据库脚本来实现业务逻 ...

  10. Concurrency != Parallelism

    前段时间在公司给大家分享GO语言的一些特性,然后讲到了并发概念,大家表示很迷茫,然后分享过程中我拿来了Rob Pike大神的Slides <Concurrency is not Parallel ...