技巧和诀窍:在ASP.NET AJAX UpdatePanel中实现对后退/前进按钮的支持

【原文地址】Tip/Trick: Enabling Back/Forward-Button Support for ASP.NET AJAX UpdatePanel
【原文发表日期】Thursday, September 14, 2006 12:25 PM

Nikhil最近写了一个好帖子,是关于一个叫做HistoryControl的支持AJAX的新ASP.NET 控件的。把它加到页面上后,允许开发人员用编程手段往浏览器的历史记录里添加逻辑视图(logical view)。这将使得支持AJAX的网站更加有用,而且遵循传统web应用所遵循的标准的前进/后退的导航惯例。

譬如,通过Nikhil的HistoryControl,开发人员可以编写类似下面这样的编码来响应一个列表的选择变动,并且把列表选择当作标识符添加到浏览器的历史记录中去:

private void ContentList_SelectedIndexChanged(object sender, EventArgs e) {
   history.AddEntry(contentList.SelectedIndex.ToString()
;
}

你一旦往历史控件里添加新项后,浏览器中的后退/前进按钮就被激活了。Nikhil的历史控件提供了一个Navigate事件,当你在浏览器里按后退/前进按钮时,这个事件就会被触发,同时它在事件处理函数的参数里提供了早先在把逻辑视图添加进浏览器历史记录时所用的那个标识符。然后你就可以使用这个标识符来把页面回复到跟这个历史记录相对应的页面状态了:

private void HistoryControl_Navigate(object sender, HistoryEventArgs e) {

    int selectedIndex 0;

    if (String.IsNullOrEmpty(e.Identifier) == false) {
        selectedIndex 
Int32.Parse(e.Identifier);
    
}

    // Update the content being displayed in the page
    
contentList.SelectedIndex selectedIndex;

    // Mark the update panels as needing an update
    
mainUpdatePanel.Update();
}

这样你的用户在使用AJAX应用时也能使用前进/后退按钮来作导航了。你可以在这里下载Nikhil的历史控件的编码,开始用在你的项目里

希望本文对你有所帮助,

Scott

(思归译)

Atlas 1.0版的命名和产品发布计划

【原文地址】“Atlas” 1.0 Naming and Roadmap
【原文发表日期】Monday, September 11, 2006 10:01 AM

在过去的一年内,我们一直在奋力开发Atlas。Atlas一直在发展,变化和成长,是因为我们得到了惊人数量的反馈和早期采纳。我们看到了围绕着这个产品的难以置信的兴趣和兴奋,光是今年,下载数目就超过25万次。

发布Atlas 1.0版

很多人要求我们在Visual Studio下个版本发布之前推出一个完全支持的Atlas 1.0版。完全支持(Fully supported)意味着,Microsoft提供每天24个小时,每周7天,一年365天的产品支持,以及任何客户可以得到热补丁(hotfix),假如他们遇到影响他们应用的bug的话。这也意味着,产品将有一个为期10年的产品生命周期的承诺─这样客户公司就能靠这个产品来开发关键业务(mission critical)的应用程序。

今天,我非常兴奋地宣布,我们将发布基于ASP.NET 2.0的完全支持的Atlas 1.0 版,而且将确保它与Visual Studio 2005的兼容。我们的目标是在年底左右发布Atlas 1.0 版。计划是,先有一个Beta,然后是RC(发布候选),然后会根据客户反馈来决定最后的发布日期。

Atlas功能(Feature)推出计划

为加速日程安排和能在今年推出完全支持的版本,我们将集中精力推出一套完全支持的核心(core)功能。这套核心功能包括,能允许开发人员建立客户端控件/组件所需的所有常用组件,以及提供与ASP.NET集成的服务器端功能(包括无比受欢迎的UpdatePanel以及其他的服务器控件)。

目前Atlas CTP版本支持的一些功能(feature)不会出现在完全支持的核心功能中。但这些功能会以单独下载的形式继续存在下去,而且会在支持的核心版本之上工作。我们并不是要撤销这些功能,而只是想试着把握好(optimize the timing)第一套完全支持的功能的发布时间,而且确保我们具有以更敏捷的方式继续发展和创新一些功能的灵活性,同时,我们想把核心层的功能“烧制好(bake down)”,以避免将来要对它们做影响巨大的变动。

很明显,我们将在未来对所有的功能继续支持Go-Live  license。那些只想使用受完全支持协议保障的产品的企业客户,可以选择只使用核心版中的那些功能。

随着时间的迁移,我们会把越来越多的功能转移到完全支持的范围中去。我们也将在未来的几个星期内发表一个详细的白皮书,列出支持的功能,发布计划,对CTP版做的产品变动等。

对Atlas的命名

作为发布Atlas的一部分,我们也将最后锁定我们以后将开始使用的产品的官方名称。以前笼统叫做Atlas的东西,从现在开始将有几个名字:

1) 客户端Atlas javascript库将被称作“微软AJAX库(Microsoft AJAX Library)”。这将能在任何浏览器中使用,也将支持任何后端web服务器 (阅读这些博客帖子以了解如何在PHPColdFusion里运行)

2) 与ASP.NET 集成极佳的服务器端Atlas功能,将被称作“ASP.NET 2.0 AJAX 扩展(ASP.NET 2.0 AJAX Extensions)”。作为改动的一部分,Atlas控件的标识前缀也将从<atlas:>变成<asp:>。这些控件将成为ASP.NET下个版本的一部分。

3) 今天的“Atlas控件工具包(Atlas Control Toolkit)是套免费的共享源码的控件和组件,使用它,你可以从ASP.NET 2.0 AJAX Extension中获取最大的价值。以后,这个项目的名称将变成 “ASP.NET AJAX 控件工具包(ASP.NET AJAX Control Toolkit)”。

结语

我们非常兴奋,我们将能推出完全支持的1.0 版。它将是100%的跨浏览器和跨平台。它将简化向ASP.NET应用添加丰富的AJAX功能,以及提供给用户改进的用户体验(UX)。把这个功能以最灵活的方式送到你的手中是我们的首要任务,我们相信,我在上面描述的计划将能达到这个目的。

等到明年的Visual Studio “Orcas”版,生活将变得更加美好,我们将添加丰富的JavaScript Intellisense,调试,和在Visual Studio中对ASP.NET AJAX Extensions的WYSIWYG设计器支持,以及还有许多其他非常棒的功能可利用。

谢谢,

Scott

 
(思归译)

CSS 控件适配器工具包新版发布

【原文地址】CSS Control Adapter Toolkit Update
【原文发表日期】Friday, September 08, 2006 6:53 PM

今天,我们发布了ASP.NET 2.0的CSS控件适配器的更新版本,内中包含了bug fixes,用户建议的的功能,以及对新控件的支持。你可以免费下载,马上开始使用它们,来给予下列ASP.NET控件用纯粹的CSS优化过的标识(markup)::

  • Menu
  • TreeView
  • GridView (新)
  • DetailsView
  • FormsView
  • DataList
  • Login (新)
  • ChangePassword (新)
  • CreateUser (新)
  • PasswordRecovery (新)
  • LoginStatus (新)

CSS控件适配器第一次发行时,我曾写帖子说明过,这些控件适配器使用了ASP.NET 2.0中一个新的内置的扩展机制,叫做“控件适配器(control adapters)”。控件适配器允许你将其接入(plug-in)任何ASP.NET 服务器控件,然后它就会覆盖,修改或细调( tweak)那个控件的显示输出逻辑。

控件适配器很酷的地方是,它们不要求页面开发人员对一个新的控件编程,或修改控件编程模型的semantics,即,跟以前一样,你仍旧使用同样的控件属性,方法,事件和模板。建造页面的开发人员可以完全忘却使用了控件适配器,控件适配器模型使得注册和封装这样的支持非常干净。

快速入门示范

在免费的Visual Web Developer或Visual Studio 2005中使用CSS控件适配器工具包,按下列步骤做:

第一步:安装CSS控件适配器工具包:  

下载和安装CSS 控件适配器工具包到你的机器上。点击这里下载一个Visual Studio的.VSI 模板项目,它会生成一个配置了CSS控件适配器的可以运行的项目模板。这是个安全的下载,它不会修改VS或ASP.NET中的任何文件或设置,所以你不要担心它是否会对现有编码造成问题。

第二步:创建一个注册了CSS控件适配器的新网站:

在Visual Web Developer或VS 2005中,在菜单里选择文件->新网站。这会打开“新网站”对话框。选择你的编程语言,然后选择新安装的“CSS友好网站(CSS Friendly Web Site)”项目模板:

这会为你创建一个新的网站项目,它的app_code目录里已经包含了CSS控件适配器的源码。它也包含了一些默认的CSS样式文件,其中有为你预先定义好了的样式类的名称(class name),你可以用它们来定制你需要的任何CSS标识(CSS markup):

第三步:试一些CSS样式控件例子: 

要看控件适配器是如何改变服务器控件的标识的话,研究一下默认添加到新项目中的walkthrough子目录

例如,在下图中,SimpleMenu.aspx网页静态地定义了一个菜单控件,该控件连到了一个OnClick事件处理方法(或者,你也可以使用导航直接转到一个特定的网页去):

<asp:Menu ID=”EntertainmentMenu” runat=”server” Orientation=”Horizontal” onmenuitemclick=”Menu_OnClick” CssSelectorClass=”SimpleEntertainmentMenu”>
    
<Items>
        
<asp:MenuItem Text=”Music”>
            
<asp:MenuItem Text=”Classical” />
            <
asp:MenuItem Text=”Rock”>
                
<asp:MenuItem Text=”Electric” />
                <
asp:MenuItem Text=”Acoustical” />
            </
asp:MenuItem>
            
<asp:MenuItem Text=”Jazz” />
        </
asp:MenuItem>
        
<asp:MenuItem Text=”Movies” Selectable=”false”>
            
<asp:MenuItem Text=”Action” />
            <
asp:MenuItem Text=”Drama” />
            <
asp:MenuItem Text=”Musical” />
        </
asp:MenuItem>
    
</Items>
</asp:Menu>

在code-behind里,Menu_OnClick事件的编码是象这样的:

    Public Sub Menu_OnClick(ByVal sender As ObjectByVal As MenuEventArgs)
        MessageLabel.Text 
“You selected ” & e.Item.Text & “.”
        
e.Item.Selected = True
    End Sub

在运行时,CSS控件适配器会导致菜单输出使用了<li>和<ul>元素的CSS样式化了的的标识,而不是表格,当我们应用一个CSS样式表到页面时,我们将得到一个好看的分层的下拉式菜单:

在看这些样本例子时,你也许要看一下CheckBoxTreeView 这个例子。它示范了如何用CSS来样式化<asp:treeview>控件以使用行内( inline)的复选框:

 

那么CSS控件适配器是如何工作的呢?

控件适配器是些继承了System.Web.UI.Adapters.ControlAdapter基类的类,实现了绘制/渲染(rendering)方法,这些方法允许控件适配器完全定制一个单独的控件显示的标识。当你使用CSS友好网站项目模板创建一个新的网站项目时,11个预建的与CSS友好的控件适配器的源码就被自动地加到你的app_code目录中了:

你可以原本不动地使用这些控件适配器类,不需要改变编码,就能得到与CSS友好的输出,或者你可以对它们进行细调,假如你需要对显示输出做任意定制的话。

控件适配器是通过在当前项目的应用程序根目录的直接子目录,/App_Browsers里,添加一个.browser文件,来与 ASP.NET注册的。.browser 文件里包含了如下所示的简单的标识,允许你指定哪个控件适配器应该用在哪个控件上:

<browsers>
  
<browser refID=”Default”>
    
<controlAdapters>
      
<adapter controlType=”System.Web.UI.WebControls.Menu” adapterType=”CSSFriendly.MenuAdapter” />
      <
adapter controlType=”System.Web.UI.WebControls.TreeView” adapterType=”CSSFriendly.TreeViewAdapter” />
      <
adapter controlType=”System.Web.UI.WebControls.DetailsView” adapterType=”CSSFriendly.DetailsViewAdapter” />
      <
adapter controlType=”System.Web.UI.WebControls.FormView” adapterType=”CSSFriendly.FormViewAdapter” />
      <
adapter controlType=”System.Web.UI.WebControls.DataList” adapterType=”CSSFriendly.DataListAdapter” />
      <
adapter controlType=”System.Web.UI.WebControls.GridView” adapterType=”CSSFriendly.GridViewAdapter” />
      <
adapter controlType=”System.Web.UI.WebControls.ChangePassword” adapterType=”CSSFriendly.ChangePasswordAdapter” />
      <
adapter controlType=”System.Web.UI.WebControls.Login” adapterType=”CSSFriendly.LoginAdapter” />
      <
adapter controlType=”System.Web.UI.WebControls.LoginStatus” adapterType=”CSSFriendly.LoginStatusAdapter” />
      <
adapter controlType=”System.Web.UI.WebControls.CreateUserWizard” adapterType=”CSSFriendly.CreateUserWizardAdapter” />
      <
adapter controlType=”System.Web.UI.WebControls.PasswordRecovery” adapterType=”CSSFriendly.PasswordRecoveryAdapter” />
    </
controlAdapters>
  
</browser>
</browsers>

如果需要,你可以针对不同的浏览器定制不同的控件适配器,或者定义这些控件适配器为“默认(Default)”,这样就会对访问你的应用的所有的浏览器都默认应用这些适配器。

做完这些配置后,就算搞定了,之后,你就可以使用标准的CSS样式表来定制所有的样式信息了。

如有疑问或要汇报任何bug或问题的话,请访问http://forums.asp.net网站的CSS Control Adapters 论坛。上面的CSS控件适配器在VS 2005网站项目模型(Web Site Project Model)和VS 2005 Web应用项目模型(Web Application Project Model)两者中都可使用。而且,CSS控件适配器有VB和C#两个版本你可以用。

在这里我要提起Russ和Heidi,为他们在创建CSS 控件适配器和样本例子方面的出色工作表示特别的感谢!

谢谢,

Scott

标签:, ,

(思归译)

IIS 7.0 RC1

【原文地址】IIS 7.0 RC1
【原文发表日期】Thursday, September 07, 2006 12:05 AM

你也许已经听说过了,上个星期晚些时候,我们发行了Windows Vista RC1。过去的几天里,我一直在我的主要机器上运行它,印象极佳。至今还没死过机,运行非常平稳。

Vista中我参与很多的程序是IIS 7.0─它将是微软web服务器平台的一个重大更新,带来的好玩意成堆。今夏早些时候,我们推出了www.iis.net网站,你可以在上面了解到关于IIS7的详细信息,以及你可以通过IIS7来做的所有酷的事情。 IIS7产品组的主管Bill Staple最近撰写了一篇非常好的博客帖子,讨论了一些他们组在Vista RC1中所做的非常酷的变动和改进。其中他谈到我们最近对新的管理用户界面做的一些变动:

在我今早在凤凰城(Phoenix)做的讲座中,我演示了你现在可以通过新的管理工具做的一些酷的事情。在这里我简单地提一下:

1) 你现在可以用管理工具在Windows客户机器上创建和管理任意数目的网站。你不再局限于单个网站(注意,上图中,我创建了三个网站)。同样地,10个连接的限制也没有了。

2) 我们把IIS 和ASP.NET 管理设置集成到了单个管理工具里。这样,你现在就可以在一个地方查看和设置认证和授权规则,而不是象以前那样要通过多个不同的对话框来做。这给管理人员提供了一个更加一致和清晰的用户界面,以及web平台上统一的管理体验。

3) 管理工具使用了新的分布式web.config配置系统。IIS7不再拥有单一的metabase 配置储存,而将使用和ASP.NET支持的同样的web.config文件模型,这样就允许你把配置和你的web应用的内容一起存储和部署。这意味着,你可以把你的设置和你的web应用一起xcopy 或FTP 到你的远程服务器上,没必要再写管理脚本来定制配置了。

4) 管理工具支持“委派管理(delegated administration)”,意味着主机供应商可以允许客户使用管理工具来远程管理他们共享的网站,当然在这种情形下,管理工具里显示的只是客户自己网站的设置,而不是整个机器的设置。我们内部使用基于HTTP的web-service,来支持跨火墙的连接,而不象以前的IIS管理工具那样,因为使用DCOM 而经常被禁止。 

5) 管理工具是用.NET和Windows Forms写成的,是可以被扩展的。这意味着你可以添加自己的UI模块到管理工具里,为你自己的HTTP 运行时模块和配置设置提供管理支持。  

6) 管理工具内置对ASP.NET 2.0的成员和角色管理系统提供管理界面的支持。这意味着你可以在管理工具里,创建和管理角色和用户,以及给用户指定角色。这工具可以连接你为ASP.NET 2.0建立的任何成员和角色提供器,只要实现了标准的ASP.NET 2.0 提供器契约,你就自动得到了对它们的完整的管理界面的支持,即使在远程共享主机的环境下也行的!

例如,我可以点击上图所示的.NET Roles 图标,创建和管理特定于我的“SampleSite”网站的角色:

然后我可以点击.NET Users图标来创建和管理我的用户,然后把他们对应到我应用中的任何角色上:

IIS 7.0中的好玩意成堆,我们将在未来的博客里讨论它们。想了解详情的话,今天就去访问www.iis.net网站或者订阅它的RSS feed

希望本文对你有所帮助,

Scott

标签:, ,
 
(思归译)

IronPython 1.0发布了

【原文地址】IronPython 1.0 Released
【原文发表日期】Wednesday, September 06, 2006 1:27 AM

我非常兴奋地宣布,今天我们发布了IronPython .NET项目的V1.0版。点击这里从CodePlex免费下载相关的程序,源码以及教程

IronPython是Python编程语言在.NET平台上的实现。它支持一个可交互的控制台,该控制台支持完全的动态编译,并且可以让Python程序员访问所有的.NET库,同时还保持对Python语言完全的兼容性。

IronPython提供了编程语言可以如何利用我们在去年发行的.NET 2.0版本的CLR中新加入的动态语言特性的一个极好的例子。譬如,象“轻量级编码生成”这样的CLR特性,现在可以让动态语言很快地在内存里编译和JIT源码,而且还有之后把它垃圾回收的能力。这意味着,你可以在运行时很快地动态调整类型,而且不用泄漏生成的编码。

IronPython也是我们在研究如何把动态语言的优点与象.NET 这样一个丰富的类库框架和执行环境结合在一起的一个很好的例子。微软IronPython项目的主架构师Jim Hugunin最近与Jon Udell 做了一个非常棒的采访录像,在其中,他示范了一堆展示IronPython特点的非常酷的使用情形(scenarios)。他的演示包括用Python来编写一个计算器程序,里面用到了WPF(即Avalon)和与Speech API的集成。他也示范了如何用象C#这样的强类型语言来重构性能要求非常高的Python编码,以及两者是如何无缝地集成的。你可以点击下面这个屏幕截图来完整收看这个采访录像:

展望未来,你将看到更多的动态语言出现在.NET平台上,更多更酷的新使用情形将成为可能。

希望本文对你有所帮助,

Scott

标签:
 
(思归译)

技巧和诀窍:用VS 2005创建可重用的项目和部件模板

【原文地址】Tip/Trick: Creating Re-Usable Project and Item Templates with VS 2005
【原文发表日期】Monday, September 04, 2006 1:19 PM

通常地,当你做项目时,你有一个标准的做法你喜欢用来组织你的编码,譬如目录布局,要包含的默认的命名空间,要包含的默认的程序集引用,标准的CSS样式表等等。这经常是开发人员在新项目一开始时最先做的事情。

VS 2005和Visual Web Developer中有个新的特征,就是很容易地创建“项目模板(Project Templates)”和“部件模板(Item Templates)”的能力。这些模板允许你捕捉住自己偏爱的编码配置和默认的项目部件,然后把它们包装在可重用的模板里,这样在开始新的项目或者添加新的项目部件时,你就能快速使用它们。这既可以省下你很多手工时间,而且还确保在新项目里,一切都设置得跟你喜欢的方式一模一样。

“项目模板”允许你指定起始的一批文件(以及它们的布局和内容),程序集引用,以及其他你创建新的项目时的习惯配置。你将会在“创建新项目”或者“创建新网站”的对话框中“我的模板(My Templates)”这一栏看到这些自定义的模板。“部件模板”则允许你创建自定义的文件模板。你将会在“添加新的部件(Add New Item)”对话框中的“我的模板”这一栏看到这些模板:

你可以用描述性的名字来对每个项目模板和部件模板命名,在VS 2005中这些模板的数目没有限制。你还可以使用内置的宏替换标记(macro replacement tokens)来定制名字,命名空间,路径,日期/时间等。你也可以很容易地将它们发布出来,与他人共享 ─ 允许你很容易地在自己的开发组里或你自己的朋友圈里散发它们。

想了解其中细节,请参考我一年前写的《如何创建可重用的网站部件模板》(英文) 这个博客帖子

Ameet Phadnis最近在ASPAlliance.com上发表了一篇更棒的文章。该文详细地介绍了如何创建和定制部件和项目模板。你可以在这里读到他的文章。

希望本文对你有所帮助,

Scott

 
(思归译)

.NET 点滴 — DLINQ, TechEd, .NET 3.0

  1. Scott Guthrie推出了他的LINQ系列的第二篇

Using DLINQ with ASP.NET (Part 2 of my LINQ series)
http://weblogs.asp.net/scottgu/archive/2006/06/04/Using-DLINQ-with-ASP.NET-2800_Part-2-of-my-LINQ-series_2900.aspx

在其中,他一步一步地演示怎么从数据库模型生成实体类,怎么使用DLINQ在GridView中显示实体类内容,怎么做Data Shaping和Projections,怎么用内嵌控件做分层数据显示(Hierarchical Binding),怎么做分页等

其他工具 [来源:Scott Guthrie]:

2. TechEd 2006正在波士顿举行,很多讲座都有现场直播的webcast,全部列单参考

https://www1.msteched.com/content/webcasts.aspx

今天收听了David Chappell的Building Modern Software: Services, Workflow, and Identity讲座。他说了一句,如果你不喜欢变化,最好退出软件行业,因为这个行业从本质上来说就是关于变化

最后他提到旧金山的金门大桥(the Golden Gate Bridge)上的桔色的漆,这漆是用来保护大桥不让含有高的盐含量的空气侵蚀桥梁的钢铁组件的,那怎么能保持不褪色呢?就是经常地上漆。做我们这一行也一样,需要不断地更新知识

  1. 微软开发部的主管Somasegar宣布WinFX改名为.NET Framework 3.0, 它将随Windows Vista一起推出,同时也能在Windows XP和Windows Server 2003上使用

http://blogs.msdn.com/somasegar/archive/2006/06/09/624300.aspx

  1. ASP.NET Atlas产品组推出了一个Javascript单元测试框架,参考

Free Atlas Control Toolkit Test Automation Harness Published [Scott Guthrie]
http://weblogs.asp.net/scottgu/archive/2006/06/09/Free-Atlas-Test-Automation-Framework-Published-.aspx

Testing the Toolkit [Shawn Burke]
http://blogs.msdn.com/sburke/archive/2006/06/07/621349.aspx

  1. 推荐Nicholas Allen的博客

http://blogs.msdn.com/drnick/

如果你对WCF(Indigo)感兴趣的话,Nicholas Allen的博客不可不读,博客内容涉及Bindings的方方面面

Ruby 和 .NET

除了上次提到的昆士兰大学在开发的Ruby.NET外,发现还有几个跟Ruby和.NET有关的项目

1。[来源:Rob Chartier] Wilco Bauwer刚推出他的IronRuby预览版

http://wilcoding.xs4all.nl/wilco/News/IronRubyPreview.aspx

他目前专注于CLR的集成,还没怎么移植Ruby的基本类库。这个预览版的内容包括对范型,接口,block/delegate,调试等的支持。

2。 John Lam的名叫RubyCLR的Ruby to CLR bridge

http://rubyforge.org/projects/rubyclr

从这个帖子里提到的支持来看,好像非常成熟,甚至支持ActiveRecord!

http://www.iunknown.com/articles/2006/03/16/third-drop-of-rubyclr

这个podcast是对RubyCLR作者的采访:

http://dnic.ca/blogs/dnic/archive/2006/05/16/37.aspx

3。 Steel是个Visual Studio 2005的Ruby语言的add-in,目前支持使用Ruby本身的解释器,句法加色,调试等
http://www.sapphiresteel.com/

另外,下面是上次提到的《Dobb博士杂志》2006年6月期的Ruby On Rails封面文章的连接

http://www.ddj.com/dept/architect/187203512;pgno=1

五月份DLINQ版本里的新功能

在五月份这个版本里,DLINQ提供了下面这些新功能

1。支持继承,目前只支持单表继承
2。对多层应用的支持
3。对远程和本地实体集合的支持
4。支持Join
5。对外部XML映射文件的支持
6。对存储过程以及自定义函数的支持
7。提供了一个DLinq Query Visualizer,在调试时查看实际SQL语句以及参数情况
8。新添加了一个设计器,用于设计类(表)间关系以及生成编码

这里还有一些细节,摘自文档《DLinq Overview for CSharp Developers.doc》第七章“New Features in May 2006 Preview”

DLINQ的新功能

在五月份这个版本里,DLINQ提供了下面这些新功能(详情参考《DLinq Overview for CSharp Developers.doc》第七章“New Features in May 2006 Preview”)

1。支持继承,目前只支持单表继承
2。对多层应用的支持,DataContext对象多了一个Attach()方法,可在不同层或不同请求中更新实体对象
3。对远程和本地实体集合的支持。实体集合实现了IQueryable<T> ,确保过滤性查询在数据库端完成
4。支持Join,这样你能做这样的查询

var q = from s in db.Suppliers
 join c in db.Customers on s.City equals c.City
 select new {
  Supplier = s.CompanyName,
  Customer = c.CompanyName,
  City = c.City
 };

5。对外部XML映射文件的支持

编码调用

String path = @”C:\Mapping\NorthwindMapping.xml”;
XmlMappingSource prodMapping =
 XmlMappingSource.FromXml(File.ReadAllText(path));
Northwind db = new Northwind(
 @”Server=.\SQLExpress;Database=c:\Northwind\Northwnd.mdf”,
 prodMapping
 );

映射文件

<Database Name=”Northwind”>
 <Table Name=”Products“>
  <Type Name=”Mapping.Product“>
   <Column Name=”ProductID” Member=”ProductID” Storage=”_ProductID”
    DbType=”Int NOT NULL IDENTITY” IsIdentity=”True”
    IsAutoGen=”True” />
   <Column Name=”ProductName” Member=”ProductName”
    Storage=”_ProductName” DbType=”NVarChar(40) NOT NULL” />
   <Column Name=”SupplierID” Member=”SupplierID” Storage=”_SupplierID”
    DbType=”Int” />
….. 
   <Association Name=”FK_Order_Details_Products” Member=”OrderDetails”
    Storage=”_OrderDetails” ThisKey=”ProductID”
    OtherTable=”Order Details” OtherKey=”ProductID” />
   <Association Name=”FK_Products_Categories” Member=”Category”
…..
  </Type>
 </Table>
 <Table Name=”Order Details”>
  <Type Name=”Mapping.OrderDetail”>
…..    
  </Type>
 </Table>

 …
</Database>

6。对存储过程以及自定义函数的支持

存储过程:

CREATE PROCEDURE GetCustomerOrderCount(@CustomerID nchar(5))
AS
Declare @count int
SELECT @count = COUNT(*) FROM ORDERS WHERE CustomerID = @CustomerID
RETURN @count

映射方法:

[StoredProcedure(Name=”GetCustomerOrderCount”)]
public int GetCustomerOrderCount(
 [Parameter(Name=”CustomerID”)] string customerID
 )
{
 StoredProcedureResult result = this.ExecuteStoredProcedure(
  ((MethodInfo)(MethodInfo.GetCurrentMethod())), customerID);

 return result.ReturnValue.Value;
}

7。提供了一个DLinq Query Visualizer,在调试时查看实际SQL语句以及参数情形

8。新添加了一个设计器,用于设计类(表)间关系以及生成编码

在项目里添加一个DLinqObjects模块,然后把Northwind数据库里的2个类Customers和Orders两个表先后拖到DLinq设计器上,设计器会根据数据库里的关系自动建立关联,同时生成下列编码

namespace LINQConsoleApplication1 { 
   
    public partial class NorthwindDataContext : System.Data.DLinq.DataContext {
       
        public System.Data.DLinq.Table<Customer> Customers;
        public System.Data.DLinq.Table<Order> Orders;   
…..
   
    [System.Data.DLinq.Table(Name=”Customers”)]
    public partial class Customer : System.Data.DLinq.INotifyPropertyChanging,

System.ComponentModel.INotifyPropertyChanged {
        private string _CustomerID;    
…..  
        private System.Data.DLinq.EntitySet<Order> _Orders;
       
…..     
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [System.Data.DLinq.Association(Name=”FK_Orders_Customers”, Storage=”_Orders”, OtherKey=”CustomerID”)]
        public virtual System.Data.DLinq.EntitySet<Order> Orders {
            get {
                return this._Orders;
            }
            set {
                this._Orders.Assign(value);
            }
        }
…..
    }
   
    [System.Data.DLinq.Table(Name=”Orders”)]
    public partial class Order : System.Data.DLinq.INotifyPropertyChanging, System.ComponentModel.INotifyPropertyChanged

{
       
        private int _OrderID;
…..
        private System.Data.DLinq.EntityRef<Customer> _Customer;
…..
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [System.Data.DLinq.Association(Name=”FK_Orders_Customers”, Storage=”_Customer”, ThisKey=”CustomerID”,

IsParent=true)]
        public Customer Customer {
            get {
                return this._Customer.Entity;
            }
            set {
                if ((this._Customer.Entity != value)) {
                    this.OnPropertyChanging(“Customer”);
                    if ((this._Customer.Entity != null)) {
                        this._Customer.Entity = null;
                        this._Customer.Entity.Orders.Remove(this);
                    }
                    this._Customer.Entity = value;
                    if ((value != null)) {
                        value.Orders.Add(this);
                    }
                    this.OnPropertyChanged(“Customer”);
                }
            }
        }
…..
    }

假设你有类似这样的数据表Person,当Type为2时表明是Employee

字段名 数据类型 允许空
Type int True
ID(主键) int False
FirstName nvarchar(200) False
LastName nvarchar(200) False
Manager int True

拖动2份Person到设计器,把第二份改名为Employee

把Manager属性从Person类删去,从Employee类,保持Manager属性,删去其他的属性,从工具箱里选择“继承”连接,然后依次选择Employee类,Person类,建立继承关系

设置DiscriminatorColumn为Type,把Employee的DiscriminatorValue设置为2,把Person的DiscriminatorValue设置为1,保存后,会生成下列编码

[System.Data.DLinq.InheritanceMapping(Code=1, Type=typeof(Person), IsDefault=true)]
[System.Data.DLinq.InheritanceMapping(Code=2, Type=typeof(Employee))]
[System.Data.DLinq.Table(Name=”Person”)]
public partial class Person : System.Data.DLinq.INotifyPropertyChanging, System.ComponentModel.INotifyPropertyChanged {  

…..
    }
   
    public partial class Employee : Person {
       
        private System.Nullable<int> _Manager;
…..
    }
}