EF6
来源:互联网 发布:万网域名不备案能用吗 编辑:程序博客网 时间:2024/05/18 03:52
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Core.Objects;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Linq.Expressions;
namespace Business
{
public class BaseDA
{
#region 通用
private DbContext _dbContext;
public DbContext CurrentContext
{
get
{
if (_dbContext == null)
{
_dbContext = new TransitContext();
}
return _dbContext;
}
}
/// <summary>
/// 执行Sql查询
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="strSql"></param>
/// <param name="paramObjects"></param>
/// <returns></returns>
public List<TEntity> SqlQuery<TEntity>(string strSql, params Object[] paramObjects) where TEntity : class
{
if (paramObjects == null)
{
paramObjects = new object[0];
}
return this.CurrentContext.Database.SqlQuery<TEntity>(strSql, paramObjects).ToList();
}
/// <summary>
/// 查询
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
public IQueryable<TEntity> Search<TEntity>(Expression<Func<TEntity, bool>> predicate) where TEntity : class
{
return CurrentContext.Set<TEntity>().Where(predicate);
}
/// <summary>
/// 查询全部
/// </summary>
/// <returns></returns>
public IQueryable<TEntity> FindAll<TEntity>() where TEntity : class
{
return CurrentContext.Set<TEntity>();
}
/// <summary>
/// 插入
/// </summary>
/// <param name="entity"></param>
/// <param name="isSave"></param>
public void Insert<TEntity>(TEntity entity, bool isSave = true) where TEntity : class
{
CurrentContext.Set<TEntity>().Add(entity);
if (isSave)
{
CurrentContext.SaveChanges();
}
}
/// <summary>
/// 批量插入
/// </summary>
/// <param name="entitys"></param>
/// <param name="isSave"></param>
public void Insert<TEntity>(List<TEntity> entitys, bool isSave = true) where TEntity : class
{
foreach (var entity in entitys)
{
CurrentContext.Set<TEntity>().Add(entity);
}
if (isSave)
{
CurrentContext.SaveChanges();
}
}
/// <summary>
/// 更新
/// </summary>
/// <param name="entity"></param>
/// <param name="isSave"></param>
public void Update<TEntity>(TEntity entity, bool isSave = true) where TEntity : class
{
var local = FindLocal(CurrentContext, entity);
if (local == null)
{
throw new Exception("要更新的实体不存在");
}
ObjectMapper.CopyProperties(entity, local);
if (isSave)
{
CurrentContext.SaveChanges();
}
}
/// <summary>
/// 批量更新
/// </summary>
/// <param name="entities"></param>
/// <param name="isSave"></param>
public void Update<TEntity>(List<TEntity> entities, bool isSave = true) where TEntity : class
{
foreach (var entity in entities)
{
var local = FindLocal(CurrentContext, entity);
if (local == null)
{
throw new Exception("要更新的实体不存在");
}
ObjectMapper.CopyProperties(entity, local);
}
if (isSave)
{
CurrentContext.SaveChanges();
}
}
/// <summary>
/// 删除
/// </summary>
/// <param name="entity"></param>
/// <param name="isSave"></param>
public void Delete<TEntity>(TEntity entity, bool isSave = true) where TEntity : class
{
var local = FindLocal(CurrentContext, entity);
if (local == null)
{
throw new Exception("要删除的实体不存在");
}
CurrentContext.Entry<TEntity>(local).State = EntityState.Deleted;
if (isSave)
{
CurrentContext.SaveChanges();
}
}
#endregion
#region private
private static void DetachOther<T>(DbContext db, T obj) where T : class
{
var local = FindLocal(db, obj);
if (local != null)
{
Detach(db, local);
}
}
private static void Detach<T>(DbContext db, T obj) where T : class
{
ObjectContext oc = ((IObjectContextAdapter)db).ObjectContext;
oc.Detach(obj);
}
private static IEnumerable<string> GetEntityKeys<T>(DbContext db) where T : class
{
ObjectContext oc = ((IObjectContextAdapter)db).ObjectContext;
var keys = oc.CreateObjectSet<T>().EntitySet.ElementType.KeyProperties.Select(x => x.Name);
return keys;
}
private static Expression<Func<T, bool>> GetFindExp<T>(T obj, IEnumerable<string> keys) where T : class
{
var p = Expression.Parameter(typeof(T), "x");
var keyexps = keys.Select(x =>
{
var member = Expression.PropertyOrField(p, x);
var objV = typeof(T).GetProperty(x).GetValue(obj, null);
var eq = Expression.Equal(member, Expression.Constant(objV));
return eq;
}).ToList();
if (keys.Count() == 1)
{
return Expression.Lambda<Func<T, bool>>(keyexps[0], new[] { p });
}
var and = Expression.AndAlso(keyexps[0], keyexps[1]);
for (var i = 2; i < keyexps.Count; i++)
{
and = Expression.AndAlso(and, keyexps[i]);
}
return Expression.Lambda<Func<T, bool>>(and, new[] { p });
}
private static T FindLocal<T>(DbContext db, T obj) where T : class
{
var keys = GetEntityKeys<T>(db);
var func = GetFindExp<T>(obj, keys);
var local = db.Set<T>().Local.FirstOrDefault(func.Compile());
if (local == null)
{
return db.Set<T>().Where(func).FirstOrDefault();
}
else
{
return local;
}
}
#endregion
}
}
- EF6
- EF6链接mysql配置
- MVC5 + EF6 简单示例
- EF6.0 学习(一)
- ef6 使用 mysql
- MVC5 + EF6 简单示例
- EF6 code first
- VS2015 + EF6连接MYSQL
- EF6 增删改查
- EF6+Oracle问题总结
- 关于EF6.0整理
- EF6+MySql code first
- VS2015 + EF6连接MYSQL
- EF6基本使用总结
- mvc5+EF6菜鸟教程
- 如何配置EF6与MYSQL
- SQLite for EF6 APP配置文件
- 经验总结12--EF6数据迁移
- Android网络编程之使用HttpClient批量上传文件(二)AsyncTask+HttpClient并实现上传进度监听
- 在Jupyter notebook和spyder上用python做数据挖掘,安装使用简介和常见错误
- c# Relative Path convert to Absolute Path
- POJ 2955 Brackets (区间DP,括号匹配)
- 用 KVM 搭建web集群实验笔记 - nagios 安装配置
- EF6
- Android网络编程之获取网络上的Json
- 经典图形的绘制(matlab)
- Url中处理中文参数问题
- 反范式
- hbm2dll的4种用法
- TensorFlow安装配置
- Oracle、MySql、SQLServer 数据分页查询
- 对于题解这种东西,我写的很差...