<head>
<title>登录</title>
</head>
<body>
<form action="../login.ashx">
用户名:<input type="text" name="username" value="$username" /><br />
密 码:<input type="text" name="password" value="$password" /><br />
<input type="hidden" name="ispostback" value="true" />
<input type="submit" value="提交"/>
<p>$msg</p>
</form>
</body>
</html>
{
public string Name { set;get;}
public int Age { set; get; }
public Person Father { set; get; }
}
把需要做的模板字段用$标示,还要声明一个person类
先把类型改为“text/html”解析html
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html";
Person person = new Person();
person.Name = "yzk";
person.Age = 30;
Person dad = new Person();
dad.Name = "ff";
dad.Age = 60;
//把father指向一个dad;
person.Father = dad;
VelocityEngine vltEngine = new VelocityEngine();//实例化一个velocity模版引擎
vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file");
vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/templates"));//模板文件所在的文件夹
vltEngine.Init();
VelocityContext vltContext = new VelocityContext();
vltContext.Put("p",person);//设置参数,在模板中可以通过$data来引用
//把person对象作为传入p
Template vltTemplate = vltEngine.GetTemplate("test.htm");
System.IO.StringWriter vltWriter = new System.IO.StringWriter();
vltTemplate.Merge(vltContext, vltWriter);
string html = vltWriter.GetStringBuilder().ToString();//得到html这个模板
context.Response.Write(html);
//context.Response.Write("Hello World");
//string username=context.Request ["username"];
//string password=context .Request ["password"];
//if (string.IsNullOrEmpty (username)&&string.IsNullOrEmpty (password ))
//{
//VelocityEngine vltEngine = new VelocityEngine();//实例化一个velocity模版引擎
//vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file");
//vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/templates"));//模板文件所在的文件夹
//vltEngine.Init();
//VelocityContext vltContext = new VelocityContext();
// vltContext.Put("username", "");//设置参数,在模板中可以通过$data来引用
// vltContext.Put("password", "");
// vltContext.Put("msg", "");
// Template vltTemplate = vltEngine.GetTemplate("login.htm");
//System.IO.StringWriter vltWriter = new System.IO.StringWriter();
//vltTemplate.Merge(vltContext, vltWriter);
//string html = vltWriter.GetStringBuilder().ToString();//得到html这个模板
//context.Response.Write(html);
//《Entity Framework 6 Recipes》中文翻译系列 (22) -----第五章 加载实体和导航属性之延迟加载 - china_fucan 阅读原文»
翻译的初衷以及为什么选择《Entity Framework 6 Recipes》来学习,请看本系列开篇
第五章 加载实体和导航属性
实体框架提供了非常棒的建模环境,它允许开发人员可视化地使用映射到数据库中的表、视图、存储过程以及关系中的实体类型。本节将向你展示如何控制查询操作中的关联实体的加载。
实体框架的默认行为是只加载应用程序直接需要的实体。通常情况下,这正是你需要的。如果实体框架通过一个或多个关联积极地加载关联实体,最终,你很有可能得到超过你需求的实体。这不但增加了内存占用,而且还影响了应用程序的性能。
在实体框架中,当加载关联实体时,你能控制并优化数据库查询执行的次数。如果在加载关联对象时精心管理的话,能提供应用程序的性能,以及对数据有更多的控制。
在本章,我们将演示加载关联数据的各种有效选项,并讲述他们的优缺点。我们会特别地讨论实体框架的默认行为 Lazy Loading(延迟加载)以及它的真正含义。然后,我们将演示在一个单独查询中,部分或者全部加载关联实体的选项。这种类型的加载,叫做Eager Loading(预先加载),它既被用来减少数据交互,也被用来控制加载哪个关联实体。
有的时候,你想延缓加载某一关联实体,因为加载它的成本太高或者不经常使用。对于这种情况,我们将介绍另一种加载关联实体的方法,它叫做Explicit Loading(显示加载)。同时演示使用Load()方法来精确控制何时加载一个或多个关联实体的多种场景。
最后,我们将简要地看看异步操作。
5-1 延迟加载关联实体
问题
你想加载一个实体,并在应用程序需要时才加载关联实体。
解决方案
假设你有如图5-1所示的模型。
图5-1 包含Customer和与它相关联信息的实体
在模型中,有一个Customer实体,一个与它关联的CustomerType和多个与它关联的CustomerEamil。它与CustomerType的关系是一对多关系,这是一个实体引用(译注:Customer中的导航属性CustomerType)。
Customer与CustomerEmail也是一对多关系,只是这时CustomerEmail在多的这一边。这是一个实体集合(译注:Customer中的导航属性CustomerEmails)。
当把它们三个实体放在一起时,就得到一个叫做对象图(object graph)的结构。一个对象图包含单个且与之关联的实体,它们构成一个整体的逻辑单元。特别地,一个对象图是一个给定实体和与之关联实体在某一特定时刻上的视图。例如,在我们的应用操作中有一个ID为5,Name为“John Smith“的customer,它有一个类型为“perferred"的CustomerType,和一个包含10个CustomerEmails的集合。
代码清单5-1.演示了实体框架加载关联实体的默认行为,Lazy Loading(延迟加载)。
代码清单5-1. 延迟加载Customer的关联实体CustomerType和CustomerEmail的实例
2 {
3 var customers = context.Customers;
4 Console.WriteLine("Customers");
5 Console.WriteLine("=========");
6
7 // 只需要Customer实体的信息
8 foreach (var customer in customers)
9 {
10 Console.WriteLine("Customer name is {0}", customer.Name);
11 }
12
13
14 //现在,需要使用到关联实体CustomerType和CustomerEamil的信息,
15 //实体框架为每个实体对象产生一个单独的查询来获取关联实体的信息。
16 foreach (var customer in customers)
17 {
18 Console.WriteLine("{0} is a {1}, email address(es)", customer.Name,
19 customer.CustomerType.Description);
20 foreach (var email in customer.CustomerEmails)
21 {
22 Console.WriteLine("\t{0}", email.Email);
23 }
24 }
25
26 // Extra credit:
27 //如果你打开Sql Server Profiler,下面的查询将不会重新去数据库查询,而是返回之前查询的内存数据
28 foreach (var customer in customers)
29 {
30 Console.WriteLine("{0} is a {1}, email address(es)", customer.Name,
31 customer.CustomerType.Description);
32 foreach (var email in customer.CustomerEmails)
33 {
34 Console.WriteLine("\t{0}", email.Email);
35 }
36 }
37 }
代码清单5-1的输出如下:
没有评论:
发表评论