凡科网做网站怎样,wordpress主题读取不到,wordpress注册默认密码,广东旅游网站建设方案上篇中Entity Framework中的Identity map和Unit of Work模式#xff0c; 由于EF中的Identity map和Unit of Work模式#xff0c;EF体现出来如下特性: 唯一性: 在一个Context的生命周期中#xff0c;一个Entity只会有一个实例#xff0c;任何对该实例的修改Entity Framework中的Identity map和Unit of Work模式 由于EF中的Identity map和Unit of Work模式EF体现出来如下特性: 唯一性: 在一个Context的生命周期中一个Entity只会有一个实例任何对该实例的修改即使这些改动没有保存到数据库中修改都会影响到整个Context的生命周期。 事务性: 所有对于Entity的修改都会在调用SaveChange方法的时候一起保存到数据库中最终实现持久化。 下面基于EF的上面特点分析一下为什么需要在MVC中实现One Context Per Request 也就是在一个Request生命周期中只有一个Context. 阅读目录: 一、每次创建Context的缺点 二、使用全局Context的缺点 三、在MVC中实现One Context Per Request 四、借助Autofac实现One Context Per Request 一每次创建Context的缺点 一般在项目的数据访问层中使用Entity Framework代码如下 public IEnumerableStudent GetStudents()
{ using (var context new SchoolContext()) { return context.Students.ToList(); }
} 这个是数据访问层中非常常见的方法返回DB中所有的Student数据。 这里在使用Context的时候创建一个Context的实例进行操作。 但是这种方式带来了下面一些缺点: 首先每次的数据处理都用new context, 会导致更多的资源开销。假如业务逻辑层调用GetStudents方法获取到数据之后要访问Student的导航属性School怎么办? 逻辑层代码使用导航时候就会导致异常因为EF只能在context生命周期中才能够再次请求数据库取得导航属性School的数据。如果是插入操作而且是多个关联表的数据插入插入操作在不同的context中完成就无法应用EF的事务效果。保证数据能够同时插入成功如果失败就一起回滚。如果在循环中插入数据每次插入数据都是在不同的context中完成性能就是一个悲剧。二使用全局Context的缺点 看到了每次创建Context”的缺点可能会认为使用全局Context是个好的解决方案。 但是全局Context带来的问题更大: 如果全局使用一个Context会导致越来越多的数据缓存到本地, 随着程序的使用时间越长占用的资源越来越大。使用全局Context, 会导致缓存数据无法得到及时更新。即使数据库中的数据有改动使用EF取出来得数据有可能还是改动之前的数据。所以: 在MVC项目中建议每个request, 使用一个Context在Winform中和WPF中一个Form或者一个Presenter一个Context在WebService Web API中每次调用, 使用一个Context.三, 在MVC中实现One Context Per Request 思路是这样的, 在Global.asax.cs文件中在Begin Request事件中创建和保存Context; 在End Request事件中销毁Context. 另外提供一个公开的静态属性来获取这个Context。 详细的代码如下: 在Global.asax.cs中 protected virtual void Application_BeginRequest()
{HttpContext.Current.Items[_EntityContext] new EntityContext();
}protected virtual void Application_EndRequest()
{var entityContext HttpContext.Current.Items[_EntityContext] as EntityContext;if (entityContext ! null)entityContext.Dispose();
} 添加静态属性以便程序中能够方便的取出和使用Context public class EntityContext
{public static EntityContext Current{get { return HttpContext.Current.Items[_EntityContext] as EntityContext; }}
} 四借助Autofac实现One Context Per Request Autofac是.net的Ioc容器具体使用的方法可以看这里 IoC容器Autofac(4) - Autofact Asp.net MVC EF Code First(附源码) 本文的Demo源码是在上面博客附带的源码基础上修改而来的。 这里只是介绍一下如何使用Autofac注册Context 在Application_Start函数体内执行如下代码 var builder new ContainerBuilder(); //创建builder
//注册builder, 实现one context per request
builder.RegisterTypeeassistdevContext().InstancePerHttpRequest();var container builder.Build();//创建容器
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));//覆盖MVC默认的实例化Controller的方法转而又Auotfac容器提供 更详细的过程可以在这里直接下载源代码 AutofactMVC(One-Context-Per-Request).zip 源代码中也使用了MiniProfler推荐一下转载于:https://www.cnblogs.com/JustRun1983/p/3249462.html