创建ObjectContextFactory类,用来获取EF上下文。当网站访问量增大时,为避免EF产生的脏数据问题,我们使用System.Runtime.Remoting.Messaging 命名空间下的CallContext来解决线程内上下文唯一。
namespace EF.DAO
{
public class ObjectContextFactory
{
public static DbContext GetCurrentObjectContext()
{
//从CallContext数据槽中获取EF上下文
DbContext objectContext = CallContext.GetData(typeof(ObjectContextFactory).FullName) as DbContext;
if (objectContext == null)
{
//如果CallContext数据槽中没有EF上下文,则创建EF上下文,并保存到CallContext数据槽中
objectContext = new DBContent();//当数据库替换为MySql等,只要在此处EF更换上下文即可。这里的DBContent是model.context.cs中的局部类
CallContext.SetData(typeof(ObjectContextFactory).FullName, objectContext);
}
return objectContext;
}
}
}
BaseDao
namespace EF.DAO
{
public class BaseDao<T> where T : class, new()
{
DbContext objectContext = ObjectContextFactory.GetCurrentObjectContext() ;//获取EF上下文
/// <summary>
/// 加载实体集合
/// </summary>
/// <param name="whereLambda"></param>
/// <returns></returns>
public virtual IQueryable<T> LoadEntites()
{
return objectContext.Set<T>().AsQueryable<T>();
}/// <summary>
/// 添加实体
/// </summary>
/// <param name="entity"></param>
/// <returns>返回更新后的实体</returns>
public virtual T AddEntity(T entity)
{
objectContext.Set<T>().Add(entity);
objectContext.SaveChanges();
return entity;
}
/// <summary>
/// 更新实体
/// </summary>
/// <param name="entity"></param>
/// <returns>返回更新后的实体</returns>
public virtual T UpdateEntity(T entity)
{
objectContext.Set<T>().Attach(entity);
objectContext.Entry<T>(entity).State = EntityState.Modified;//将附加的对象状态更改为修改
objectContext.SaveChanges();
return entity;
}
/// <summary>
/// 删除实体
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public virtual bool DelEntity(T entity)
{
objectContext.Set<T>().Attach(entity);
objectContext.Entry<T>(entity).State = EntityState.Deleted;//将附加的实体状态更改为删除
if (objectContext.SaveChanges() > 0)
{
return true;//删除成功
}
else
{
return false;//删除失败
}
}
}
}