Entity FrameWork(EF)6.0.2 增删修读(READ)的操作实现
2014-03-10 13:10
501 查看
第一步:首先创建一个接口,用以暴露其操作的方法
public interface IOperate<TEntity>
{
List<TEntity> FindAll();
// TEntity FindByKey(object key);
int Add(TEntity entity);
int AddRange(IEnumerable<TEntity> entities);
int Delete(TEntity entity);
// int DeleteByKey(object key);
// int ChangeStatus(object key, object status);
int DeleteRange(IEnumerable<TEntity> entities);
int Update(TEntity entity);
// int Save(TEntity entity);
int ExecuteSql(string cmdStr, object[] paras);
List<TEntity> SqlQuery(string queryCmdStr, object[] paras);
}
第二部:实现接口,也就是用EF实现数据库的操作
public class EfOperate<TEntity> : IOperate<TEntity> where TEntity : class
{
private VehicleCheckDBEntities _module;
private static readonly object LockHelper = new object();
public List<TEntity> SqlQuery(string queryCmdStr, object[] paras)
{
try
{
using (_module = new VehicleCheckDBEntities())
{
return paras == null ? _module.Database.SqlQuery<TEntity>(queryCmdStr).ToList() : _module.Database.SqlQuery<TEntity>(queryCmdStr, paras).ToList();
}
}
catch (Exception error)
{
throw new Exception(error.Message);
}
}
/// <summary>
/// 执行Sql语句
/// </summary>
/// <returns></returns>
public int ExecuteSql(string cmdStr, object[] paras)
{
/*
const string cmdStr = "update students set
name=@name where id<=@id";
var paras = new object[]
{
new SqlParameter("@name","哈哈"),
new SqlParameter("@id",3)
};
*/
DbContextTransaction transaction = null;
try
{
lock (LockHelper)
{
using (_module = new VehicleCheckDBEntities())
{
using (transaction = _module.Database.BeginTransaction())
{
int rtnNUmber = paras == null
? _module.Database.ExecuteSqlCommand(cmdStr)
: _module.Database.ExecuteSqlCommand(cmdStr, paras);
_module.SaveChanges();
transaction.Commit();
return rtnNUmber;
}
}
}
}
catch (Exception error)
{
if (transaction != null)
transaction.Rollback();
throw new Exception(error.Message);
}
}
protected DbSet<TEntity> DbSet
{
get
{
try
{
using (_module = new VehicleCheckDBEntities())
{
return _module.Set<TEntity>();
}
}
catch (Exception error)
{
throw new Exception(error.Message);
}
}
}
public List<TEntity> FindAll()
{
try
{
using (_module = new VehicleCheckDBEntities())
{
return _module.Set<TEntity>().ToList();
}
}
catch (Exception error)
{
throw new Exception(error.Message);
}
}
/// <summary>
/// 添加记录
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public int Add(TEntity entity)
{
#region 方法一 已测试
#if ceshi
using (module = new EfModule())
{
var entry = module.Entry(entity);
if (entry.State == EntityState.Detached)
{
entry.State = EntityState.Added;
}
return module.SaveChanges();
}
#endif
#endregion
#region 方法二 已测试
DbContextTransaction transaction = null;
try
{
using (_module = new VehicleCheckDBEntities())
{
using (transaction = _module.Database.BeginTransaction())
{
_module.Set<TEntity>().Add(entity);
int rtnNumber = _module.SaveChanges();
transaction.Commit();
return rtnNumber;
}
}
}
catch (Exception error)
{
if (transaction != null)
transaction.Rollback();
throw new Exception(error.Message);
}
#endregion
}
/// <summary>
/// 添加多条记录
/// </summary>
/// <param name="entities"></param>
/// <returns></returns>
public int AddRange(IEnumerable<TEntity> entities)
{
DbContextTransaction transaction = null;
try
{
using (_module = new VehicleCheckDBEntities())
{
using (transaction = _module.Database.BeginTransaction())
{
_module.Set<TEntity>().AddRange(entities);
int rtnNumber = _module.SaveChanges();
transaction.Commit();
return rtnNumber;
}
}
}
catch (Exception error)
{
if (transaction != null)
transaction.Rollback();
throw new Exception(error.Message);
}
}
/// <summary>
/// 修改记录
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public int Update(TEntity entity)
{
//修改不像Add或Remove有直接的方法,所以必须更改记录在上下文的状态为EntityState.Modified
DbContextTransaction transaction = null;
try
{
lock (LockHelper)
{
using (_module = new VehicleCheckDBEntities())
{
using (transaction = _module.Database.BeginTransaction())
{
var entry = _module.Entry(entity);
if (entry.State == EntityState.Detached)
{
_module.Set<TEntity>().Attach(entity);
entry.State = EntityState.Modified;
}
int rtnNumber = _module.SaveChanges();
transaction.Commit();
return rtnNumber;
}
}
}
}
catch (Exception error)
{
if (transaction != null)
transaction.Rollback();
throw new Exception(error.Message);
}
}
/// <summary>
/// 删除记录
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public int Delete(TEntity entity)
{
#region 方法一 已测试 优点:使用任何类;不足之处是要手动更改记录在上下文的状态为 EntityState.Deleted,与修改原理一样
//using (module = new EfModule())
//{
// var entry = module.Entry(entity);
// if (entry.State == EntityState.Detached)
// {
// entry.State = EntityState.Deleted;
// }
// return module.SaveChanges();
//}
#endregion
#region 方法2 已测试 直接删除,缺点: 只能使用Student类
//using (EfModule module = new EfModule())
//{
// var info = module.Students.Where(o => o.Id == 7).First();//若检索到的对象是在using外面生成的,则会报错
// module.Set<Student>().Remove(info); // module.Students.Remove(info); 两者都可以
// return module.SaveChanges();
//}
#endregion
#region 方法3 已测试 直接删除,优点:使用任何类,把记录直接添加到上下文中,当Remove时会把状态自动改为Deleted
DbContextTransaction transaction = null;
try
{
using (_module = new VehicleCheckDBEntities())
{
using (transaction = _module.Database.BeginTransaction())
{
//if (_module.Set<TEntity>().Any(o => o.Id == entity.Id))
//{
_module.Set<TEntity>().Attach(entity);
_module.Set<TEntity>().Remove(entity);
int rtnNumber = _module.SaveChanges();
transaction.Commit();
return rtnNumber;
//}
//return 0;
}
}
}
catch (Exception error)
{
if (transaction != null)
transaction.Rollback();
throw new Exception(error.Message);
}
#endregion
}
/// <summary>
/// 删除多条记录
/// </summary>
/// <param name="entities"></param>
/// <returns></returns>
public int DeleteRange(IEnumerable<TEntity> entities)
{
DbContextTransaction transaction = null;
try
{
using (_module = new VehicleCheckDBEntities())
{
using (transaction = _module.Database.BeginTransaction())
{
foreach (var entity in entities)
{
//if (_module.Set<TEntity>().Any(o => o.Id == entity.Id))
//{
var entry = _module.Entry(entity);
if (entry.State == EntityState.Detached)
{
entry.State = EntityState.Deleted;
}
//}
}
int rtnNumber = _module.SaveChanges();
transaction.Commit();
return rtnNumber;
}
}
}
catch (Exception error)
{
if (transaction != null)
transaction.Rollback();
throw new Exception(error.Message);
}
}
}
第三步:创建对象
private static readonly IOperate<Device> DeviceOperate = new EfOperate<Device>();//创建操作表Device的对象
public static readonly IOperate<DeviceDeny> DeviceDenyOperate = new EfOperate<DeviceDeny>();//创建操作表DeviceDeny的对象
第四步:调用对象的方法
public int SaveDeviceDeny(DeviceDeny deviceDeny)
{
try
{
return deviceDeny.Id > 0 ? DeviceDenyOperate.Update(deviceDeny) : DeviceDenyOperate.Add(deviceDeny);
}
catch (Exception error)
{
throw new Exception(error.Message);
}
}
public int ChangeStatus(int key, int status)
{
const string cmdStr = "update device set
status=@status where id=@id";
var paras = new object[]
{
new SqlParameter("@status",status),
new SqlParameter("@id",key)
};
try
{
return DeviceOperate.ExecuteSql(cmdStr, paras);
}
catch (Exception error)
{
throw new Exception(error.Message);
}
}
public int DeleteDevice(int key)
{
string cmdStr =string.Format( "delete device where id={0}",key);
try
{
return DeviceOperate.ExecuteSql(cmdStr, null);
}
catch (Exception error)
{
throw new Exception(error.Message);
}
}
public int SaveDevice(Device device)
{
if (device == null)
return -1;
try
{
if (device.Id > 0)
{
const string cmdStr = " update device set UsedTimes=isnull(UsedTimes,0)+1,
LastUsingIp=@lastip,LastUsingDate=@lastdate ,LastUsingUserID=@userId where
id=@id ";
//var parameter = new object[]
// {
// new SqlParameter("@times", device.UsedTimes),
// new SqlParameter("@lastip", device.LastUsingIp),
// new SqlParameter("@lastdate", device.LastUsingDate),
// new SqlParameter("@userId", device.LastUsingUserID),
// new SqlParameter("@id", device.Id)
// };
//return DeviceOperate.ExecuteSql(cmdStr, parameter);
var parameter = new DbParameter[]
{
new SqlParameter("@times", device.UsedTimes),
new SqlParameter("@lastip", device.LastUsingIp),
new SqlParameter("@lastdate", device.LastUsingDate),
new SqlParameter("@userId", device.LastUsingUserID),
new SqlParameter("@id", device.Id)
};
return DbHelper.ExecuteNonQuery(CommandType.Text, cmdStr, parameter);
}
return DeviceOperate.Add(device);
}
catch (Exception error)
{
throw new Exception(error.Message);
}
}
实践心得:
首先说一下不足之处,就是在修改方法的实现还是不尽人意,当并发调用的时候,程序会报错,大体的意思是当实体类里加载了一条记录时,修改的时候可能由于对这条数据加了锁,无法进行修改;第二个错误就是实体对象模型connection已经关闭,无法对其进行操作,但是ADD方法与Delete方法不会出现此错误,所以我在Update方法中加了Lock,错误便不会出现。也即下面代码:
/// <summary>
/// 修改记录
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public int Update(TEntity entity)
{
//修改不像Add或Remove有直接的方法,所以必须更改记录在上下文的状态为EntityState.Modified
DbContextTransaction transaction = null;
try
{
lock (LockHelper)
{
using (_module = new VehicleCheckDBEntities())
{
using (transaction = _module.Database.BeginTransaction())
{
var entry = _module.Entry(entity);
if (entry.State == EntityState.Detached)
{
_module.Set<TEntity>().Attach(entity);
entry.State = EntityState.Modified;
}
int rtnNumber = _module.SaveChanges();
transaction.Commit();
return rtnNumber;
}
}
}
}
catch (Exception error)
{
if (transaction != null)
transaction.Rollback();
throw new Exception(error.Message);
}
}
PS:另如果有更优化方案,望请指点,知识用来分享,从而才能在知识中得到乐趣!
public interface IOperate<TEntity>
{
List<TEntity> FindAll();
// TEntity FindByKey(object key);
int Add(TEntity entity);
int AddRange(IEnumerable<TEntity> entities);
int Delete(TEntity entity);
// int DeleteByKey(object key);
// int ChangeStatus(object key, object status);
int DeleteRange(IEnumerable<TEntity> entities);
int Update(TEntity entity);
// int Save(TEntity entity);
int ExecuteSql(string cmdStr, object[] paras);
List<TEntity> SqlQuery(string queryCmdStr, object[] paras);
}
第二部:实现接口,也就是用EF实现数据库的操作
public class EfOperate<TEntity> : IOperate<TEntity> where TEntity : class
{
private VehicleCheckDBEntities _module;
private static readonly object LockHelper = new object();
public List<TEntity> SqlQuery(string queryCmdStr, object[] paras)
{
try
{
using (_module = new VehicleCheckDBEntities())
{
return paras == null ? _module.Database.SqlQuery<TEntity>(queryCmdStr).ToList() : _module.Database.SqlQuery<TEntity>(queryCmdStr, paras).ToList();
}
}
catch (Exception error)
{
throw new Exception(error.Message);
}
}
/// <summary>
/// 执行Sql语句
/// </summary>
/// <returns></returns>
public int ExecuteSql(string cmdStr, object[] paras)
{
/*
const string cmdStr = "update students set
name=@name where id<=@id";
var paras = new object[]
{
new SqlParameter("@name","哈哈"),
new SqlParameter("@id",3)
};
*/
DbContextTransaction transaction = null;
try
{
lock (LockHelper)
{
using (_module = new VehicleCheckDBEntities())
{
using (transaction = _module.Database.BeginTransaction())
{
int rtnNUmber = paras == null
? _module.Database.ExecuteSqlCommand(cmdStr)
: _module.Database.ExecuteSqlCommand(cmdStr, paras);
_module.SaveChanges();
transaction.Commit();
return rtnNUmber;
}
}
}
}
catch (Exception error)
{
if (transaction != null)
transaction.Rollback();
throw new Exception(error.Message);
}
}
protected DbSet<TEntity> DbSet
{
get
{
try
{
using (_module = new VehicleCheckDBEntities())
{
return _module.Set<TEntity>();
}
}
catch (Exception error)
{
throw new Exception(error.Message);
}
}
}
public List<TEntity> FindAll()
{
try
{
using (_module = new VehicleCheckDBEntities())
{
return _module.Set<TEntity>().ToList();
}
}
catch (Exception error)
{
throw new Exception(error.Message);
}
}
/// <summary>
/// 添加记录
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public int Add(TEntity entity)
{
#region 方法一 已测试
#if ceshi
using (module = new EfModule())
{
var entry = module.Entry(entity);
if (entry.State == EntityState.Detached)
{
entry.State = EntityState.Added;
}
return module.SaveChanges();
}
#endif
#endregion
#region 方法二 已测试
DbContextTransaction transaction = null;
try
{
using (_module = new VehicleCheckDBEntities())
{
using (transaction = _module.Database.BeginTransaction())
{
_module.Set<TEntity>().Add(entity);
int rtnNumber = _module.SaveChanges();
transaction.Commit();
return rtnNumber;
}
}
}
catch (Exception error)
{
if (transaction != null)
transaction.Rollback();
throw new Exception(error.Message);
}
#endregion
}
/// <summary>
/// 添加多条记录
/// </summary>
/// <param name="entities"></param>
/// <returns></returns>
public int AddRange(IEnumerable<TEntity> entities)
{
DbContextTransaction transaction = null;
try
{
using (_module = new VehicleCheckDBEntities())
{
using (transaction = _module.Database.BeginTransaction())
{
_module.Set<TEntity>().AddRange(entities);
int rtnNumber = _module.SaveChanges();
transaction.Commit();
return rtnNumber;
}
}
}
catch (Exception error)
{
if (transaction != null)
transaction.Rollback();
throw new Exception(error.Message);
}
}
/// <summary>
/// 修改记录
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public int Update(TEntity entity)
{
//修改不像Add或Remove有直接的方法,所以必须更改记录在上下文的状态为EntityState.Modified
DbContextTransaction transaction = null;
try
{
lock (LockHelper)
{
using (_module = new VehicleCheckDBEntities())
{
using (transaction = _module.Database.BeginTransaction())
{
var entry = _module.Entry(entity);
if (entry.State == EntityState.Detached)
{
_module.Set<TEntity>().Attach(entity);
entry.State = EntityState.Modified;
}
int rtnNumber = _module.SaveChanges();
transaction.Commit();
return rtnNumber;
}
}
}
}
catch (Exception error)
{
if (transaction != null)
transaction.Rollback();
throw new Exception(error.Message);
}
}
/// <summary>
/// 删除记录
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public int Delete(TEntity entity)
{
#region 方法一 已测试 优点:使用任何类;不足之处是要手动更改记录在上下文的状态为 EntityState.Deleted,与修改原理一样
//using (module = new EfModule())
//{
// var entry = module.Entry(entity);
// if (entry.State == EntityState.Detached)
// {
// entry.State = EntityState.Deleted;
// }
// return module.SaveChanges();
//}
#endregion
#region 方法2 已测试 直接删除,缺点: 只能使用Student类
//using (EfModule module = new EfModule())
//{
// var info = module.Students.Where(o => o.Id == 7).First();//若检索到的对象是在using外面生成的,则会报错
// module.Set<Student>().Remove(info); // module.Students.Remove(info); 两者都可以
// return module.SaveChanges();
//}
#endregion
#region 方法3 已测试 直接删除,优点:使用任何类,把记录直接添加到上下文中,当Remove时会把状态自动改为Deleted
DbContextTransaction transaction = null;
try
{
using (_module = new VehicleCheckDBEntities())
{
using (transaction = _module.Database.BeginTransaction())
{
//if (_module.Set<TEntity>().Any(o => o.Id == entity.Id))
//{
_module.Set<TEntity>().Attach(entity);
_module.Set<TEntity>().Remove(entity);
int rtnNumber = _module.SaveChanges();
transaction.Commit();
return rtnNumber;
//}
//return 0;
}
}
}
catch (Exception error)
{
if (transaction != null)
transaction.Rollback();
throw new Exception(error.Message);
}
#endregion
}
/// <summary>
/// 删除多条记录
/// </summary>
/// <param name="entities"></param>
/// <returns></returns>
public int DeleteRange(IEnumerable<TEntity> entities)
{
DbContextTransaction transaction = null;
try
{
using (_module = new VehicleCheckDBEntities())
{
using (transaction = _module.Database.BeginTransaction())
{
foreach (var entity in entities)
{
//if (_module.Set<TEntity>().Any(o => o.Id == entity.Id))
//{
var entry = _module.Entry(entity);
if (entry.State == EntityState.Detached)
{
entry.State = EntityState.Deleted;
}
//}
}
int rtnNumber = _module.SaveChanges();
transaction.Commit();
return rtnNumber;
}
}
}
catch (Exception error)
{
if (transaction != null)
transaction.Rollback();
throw new Exception(error.Message);
}
}
}
第三步:创建对象
private static readonly IOperate<Device> DeviceOperate = new EfOperate<Device>();//创建操作表Device的对象
public static readonly IOperate<DeviceDeny> DeviceDenyOperate = new EfOperate<DeviceDeny>();//创建操作表DeviceDeny的对象
第四步:调用对象的方法
public int SaveDeviceDeny(DeviceDeny deviceDeny)
{
try
{
return deviceDeny.Id > 0 ? DeviceDenyOperate.Update(deviceDeny) : DeviceDenyOperate.Add(deviceDeny);
}
catch (Exception error)
{
throw new Exception(error.Message);
}
}
public int ChangeStatus(int key, int status)
{
const string cmdStr = "update device set
status=@status where id=@id";
var paras = new object[]
{
new SqlParameter("@status",status),
new SqlParameter("@id",key)
};
try
{
return DeviceOperate.ExecuteSql(cmdStr, paras);
}
catch (Exception error)
{
throw new Exception(error.Message);
}
}
public int DeleteDevice(int key)
{
string cmdStr =string.Format( "delete device where id={0}",key);
try
{
return DeviceOperate.ExecuteSql(cmdStr, null);
}
catch (Exception error)
{
throw new Exception(error.Message);
}
}
public int SaveDevice(Device device)
{
if (device == null)
return -1;
try
{
if (device.Id > 0)
{
const string cmdStr = " update device set UsedTimes=isnull(UsedTimes,0)+1,
LastUsingIp=@lastip,LastUsingDate=@lastdate ,LastUsingUserID=@userId where
id=@id ";
//var parameter = new object[]
// {
// new SqlParameter("@times", device.UsedTimes),
// new SqlParameter("@lastip", device.LastUsingIp),
// new SqlParameter("@lastdate", device.LastUsingDate),
// new SqlParameter("@userId", device.LastUsingUserID),
// new SqlParameter("@id", device.Id)
// };
//return DeviceOperate.ExecuteSql(cmdStr, parameter);
var parameter = new DbParameter[]
{
new SqlParameter("@times", device.UsedTimes),
new SqlParameter("@lastip", device.LastUsingIp),
new SqlParameter("@lastdate", device.LastUsingDate),
new SqlParameter("@userId", device.LastUsingUserID),
new SqlParameter("@id", device.Id)
};
return DbHelper.ExecuteNonQuery(CommandType.Text, cmdStr, parameter);
}
return DeviceOperate.Add(device);
}
catch (Exception error)
{
throw new Exception(error.Message);
}
}
实践心得:
首先说一下不足之处,就是在修改方法的实现还是不尽人意,当并发调用的时候,程序会报错,大体的意思是当实体类里加载了一条记录时,修改的时候可能由于对这条数据加了锁,无法进行修改;第二个错误就是实体对象模型connection已经关闭,无法对其进行操作,但是ADD方法与Delete方法不会出现此错误,所以我在Update方法中加了Lock,错误便不会出现。也即下面代码:
/// <summary>
/// 修改记录
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public int Update(TEntity entity)
{
//修改不像Add或Remove有直接的方法,所以必须更改记录在上下文的状态为EntityState.Modified
DbContextTransaction transaction = null;
try
{
lock (LockHelper)
{
using (_module = new VehicleCheckDBEntities())
{
using (transaction = _module.Database.BeginTransaction())
{
var entry = _module.Entry(entity);
if (entry.State == EntityState.Detached)
{
_module.Set<TEntity>().Attach(entity);
entry.State = EntityState.Modified;
}
int rtnNumber = _module.SaveChanges();
transaction.Commit();
return rtnNumber;
}
}
}
}
catch (Exception error)
{
if (transaction != null)
transaction.Rollback();
throw new Exception(error.Message);
}
}
PS:另如果有更优化方案,望请指点,知识用来分享,从而才能在知识中得到乐趣!
相关文章推荐
- php中操作memcached缓存进行增删改查数据的实现代码
- Android学习--------实现增删改查数据库操作以及实现相似微信好友对话管理操作
- 用java实现对MongoDB的基本操作(增删改查)
- java实现二叉搜索树(BST)包含增删和遍历操作
- Go操作mysql实现增删改查及连接池
- 控制台程序实现利用CRM组织服务和SqlConnection对数据库中数据的增删改查操作
- C#基于DBContext(EF)实现通用增删改查的REST方法实例
- android sqlite 数据库创建及增删改查的操作实现
- 封装read、write、accept、connect函数,实现超时操作。
- nodejs操作mysql实现增删改查数据操作
- JS数组操作之增删改查的简单实现
- JAVAWEB开发之mybatis详解(一)——mybatis的入门(实现增删改查操作)、自定义别名、抽取代码块以及动态SQL的使用
- JDBC实现数据库的增删改查操作实例
- hibernate通过session实现增删改查操作实例解析
- JAVAWEB开发之mybatis详解(一)——mybatis的入门(实现增删改查操作)、自定义别名、抽取代码块以及动态SQL的使用
- 使用PHP连接数据库_实现用户数据的增删改查的整体操作示例
- python操作mysql数据库实现增删改查
- C语言实现顺序表的创建与增删改查操作
- EF Codefirst 多对多关系 操作中间表的 增删改查(CRUD)
- Dao接口实现基本的数据库操作。增删改查