您的位置:首页 > 其它

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:另如果有更优化方案,望请指点,知识用来分享,从而才能在知识中得到乐趣!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: