RSS 2.0 Feed
Data
摘要:【原文地址】ASP.NET Dynamic Data Preview Available【原文发表日期】Thursday, April 10, 2008 12:44 AM 几个月前,我们推出了ASP.NET 3.5 Extensions的预览版,该版本内含一堆今年稍后会发布的新特性(包括ASP.NET AJAX方面的改进,ASP.NET MVC,ASP.NET Silverlight支持,以及ASP.NET动态数据)。 该预览版中的ASP.NET动态数据(Dynamic Data)支持对一个很酷的新特性提供了初览,该特性允许你很快地建造使用LINQ to SQL或LINQ to Entities对象模型的数据驱动的网站。 ASP.NET动态数据允许你自动地根据你的ORM数据模型的元数据动态地生成功能完整的数据输入和报表网页。除了支持动态渲染模式外,它还允许你使用任何你想要的HTML或代码来覆盖和定制任何视图模板(给你完整的体验控制)。 ASP.NET动态数据预览 今天,我们发布了ASP.NET动态数据的更新版,你可以在这里了解相关详情和下载。 这个新的动态数据预览版现在可以与标准的内置ASP.NET数据控件(包括GridView,ListView,FormView,DetailsView等)协作了,动态数据支持允许这些控件自动地处理外键关系。例如,在一个GridView上,你现在将得到外键字段值的友好名称的自动显示,以及在编辑模式下这些值的自动下拉框选择支持: 新的动态数据支持还能根据你在数据模型类上设置的约束提供自动的UI验证支持(同时支持客户端和服务器端)。例如,如果数据库中的一个字段在大小上限于50个字符,并且被标记为不能为空,ASP.NET动态数据就会自动地将合适的UI控件校验器加到UI页上以强制这个约束。如果你在LINQ to SQL或LINQ to Entities数据模型类里改变了约束,UI就会自动地反应这些变动,并且在下一个web请求中强制新的约束。 除了标准的数据模型元数据外,你还可以声明自定义的元数据以进一步控制验证和对象界面的默认显示。 你既能在LINQ to SQL中,也能在LINQ to Entities中使用上面所有的特性。 Visual Studio动态数据项目向导(Project Wizard) 除了核心的ASP.NET动态数据运行时支持外,VS web工具开发团队今天还发布了新的动态数据项目向导的第一个预览版,该向导允许你很快地开始一个数据驱动的网站。该向导允许你选择数据库,然后选择你想用来建造 LINQ to SQL数据模型的数据表,视图和存储过程: 在创建数据模型之后,该向导允许你轻松地选择动态数据驱动的模板网页来建造界面: 然后你能选择每个网页上支持的数据插入、编辑、更新界面的类型: 在你点击“完成”之后,它会用你的数据模型类和数据界面网页配置生成一个项目。你可以在这里了解该向导的有关详情,以及观看一个实战示范的screencast。 如何入门 你可以在 这里了解这个新的动态数据预览版的详情以及下载它在本地运行。 你可以观看David Ebbo在MIX 08上做的动态数据讲座以了解其工作原理的细节。也看一下Scott Hunter这里的screencast,以及Brad Millington这里的screencast。 David这里还有一个贴子,讨论十二月份预览版与今天的预览版本之间的变动。 你可以在www.asp.net上这里的论坛上问问题或提交反馈。 希望本文对你有所帮助, Scott 标签: ASP.NET, .NET, LINQ, Data...[阅读全文]

posted @ | Feedback (2) | Filed Under [ ASP.NET .NET LINQ Data ]

摘要:【原文地址】New ASP.NET Dynamic Data Support【原文发表日期】 Friday, December 14, 2007 12:41 AM 上个周末发布的ASP.NET 3.5 Extensions CTP预览版包括了一堆很棒的新特性。 其中一个新特性是我们称之为“ASP.NET Dynamic Data Support(动态数据支持)”的东西。简单地说,这个东西允许你极其快速地建造可以使用LINQ to SQL(在将来LINQ to Entities)对象模型的数据驱动的网站,还允许你不用手工建造任何网页。 看它在实战中的例子的最佳方式是观看David Ebbo的精彩的17分钟屏播: 你也可以按下面的步骤来轻松上手,开始使用动态数据支持: 第一步: 创建ASP.NET动态数据网站 在安装ASP.NET 3.5 Extensions CTP预览版之后,你可以使用VS 2008或免费的Visual Web Developer 2008 Express版来创建启用ASP.NET动态数据支持的新网站项目或新Web应用项目: 这会创建一个可用的新网站,其中包括了一些默认的模板文件,以及你可以用来定制模板文件观感(look and feel)的CSS样式表: 第二步: 添加LINQ to SQL数据模型 LINQ to SQL是.NET 3.5中内置的O/RM(对象关系映射器),它允许你使用.NET类来对关系数据库建模。然后你可以使用LINQ来对数据库进行查询,以及在其中更新、插入和删除数据。 LINQ to SQL完全支持事务,视图和存储过程。它还提供了简易方式来将数据验证和业务逻辑规则集成进你的数据模型。 开始使用ASP.NET动态数据网站的最简便的方式是向你的项目中添加一个新的LINQ to SQL数据模型(右击->添加新项->LINQ to SQL类)。这会调出LINQ to SQL类设计器。从你的服务器管理器中把数据库数据表拖拉到设计器表面,为你的数据库数据定义(schema)来建立一些类(包括其间的关系): 第三步: 在项目中启用动态模板 在默认情形下,ASP.NET动态数据项目提供了内置支持,为你的LINQ to SQL和LINQ to Entities数据模型创建自动的“scaffolding(脚手架)”视图。动态数据项目包括了一些模板页和用户控件,可以自动地创建内置的浏览、编辑、选择和删除数据的用户界面,这些界面是根据你加到项目里的LINQ to SQL或者LINQ to Entities数据模型,在运行时动态构建的。 为启用这个自动scaffolding的支持,打开你项目的web.config文件,找一下其中的dynamicData节,把它的enableTemplates属性设为true: 注: 这个自动scaffolding特性在默认情形下为安全的原因是关掉的(我们要你明确地设置来启用这个特性)。 注: 就象你在上面看到的那样,ASP.NET动态数据配置节还提供了可选的URL映射支持,该支持允许你将你的动态scaffold网页定制成你想要的任何URL格式。 第四步: 运行你的网站 按F5运行你的项目,默认情形下,你会被转到default.aspx网页,上面列出了你数据模型中的所有数据表对象: 注: default.aspx主页是项目中的一个文件,如果你不喜欢这个网页的样子,你可以打开它,编辑成你想要的样子。......[阅读全文]

posted @ | Feedback (4) | Filed Under [ ASP.NET .NET LINQ Data ]

摘要:【原文地址】Using LINQ to SQL (Part 1)【原文发表日期】 Saturday, May 19, 2007 12:41 AM 在过去的几个月中我写了一系列涵盖了VS和.NET Framework Orcas版中的一些新特性的帖子,下面是这些帖子的链接: 自动属性,对象初始化器,和集合初始化器 扩展方法 Lambda表达式 查询句法 匿名类型 以上的语言特性帮助数据查询成为一等编程概念。我们称这个总的查询编程模型为“LINQ”--它指的是.NET语言级集成查询。 开发者可以在任何的数据源上使用LINQ。他们可以在他们选择的编程语言中表达高效的查询行为,选择将查询结果转换或构形成他们想要的任何格式,然后非常方便地操作这个结果集。有LINQ功能的语言可以提供完全的类型安全和查询表达式的编译时检查,而开发工具则可以提供在编写LINQ代码时完全的智能感知,调试,和丰富的重构支持。 LINQ支持一个非常丰富的的扩展性模型,该模型将有助于对不同的数据源生成不同的高效运算因子(domain-specific operators)。.NET Framework的Orcas版本将发布一些内置库,这些库提供了针对对象(Objects),XML,和数据库的LINQ支持。 什么是LINQ to SQL? LINQ to SQL 是随.NET Framework Orcas版一起发布的O/RM(对象关系映射)实现,它允许你用.NET 的类来对一个关系型数据库建模。然后你可以用LINQ对数据库进行查询,以及进行更新/插入/删除数据的操作。 LINQ to SQL完全支持事务,视图和存储过程。它还提供了一种把数据验证和业务逻辑规则结合进你的数据模型的便利方式。 使用LINQ to SQL对数据库建模: Visual Studio Orcas版中提供了一个LINQ to SQL设计器,该设计器提供了一种简易的方式,将数据库可视化地转换为LINQ to SQL对象模型。我下一篇博客将会更深入一些来介绍怎么使用该设计器(你可以观看我一月份时录制的这个关于如何从头开始创建LINQ to SQL模型的录像)。 通过LINQ to SQL设计器,我可以方便地设计出如下所示的Northwind数据库的示例模型: 上图定义了四个实体类:Product, Category, Order 和 OrderDetail。每个类的属性都映射到数据库中相应表的字段,类实体的每个实例代表了数据表中的一行记录。 在上图中,四个实体类间的箭头代表了不同实体间的关联/关系。它们主要是根据数据库中的主键/外键关系生成的。设计器上的箭头的指向表明了该关系是一对一还是一对多的关系。基于此,强类型的属性将会被加入到实体类中。例如,上边的Category类和Product类之间有一个“一对多”的关系。这意味着Category类将有一个"Products"属性,该属性代表了在该类中所有的产品对象的集合。而Product类将会有一个"Category"属性来指向一个Category类的实例,该Category类的实例表明了了产品所属的类别。 上图中LINQ to SQL设计器的右侧列出了与我们的数据库模型交互的存储过程。在上边的例子中,我添加了一个“GetProductsByCategory”存储过程。它有一个categoryID作为输入参数,返回一个产品实体序列作为结果集。下面的代码将展示如何调用该存储过程。 理解DataContext类 当你点击LINQ to SQL设计器上的“保存"按钮时,Visual Studio将会保存我们建立的代表了实体和数据库关系的各个类。针对加入到我们的解决方案的每一个LINQ to SQL设计器文件,同时也会生成一个自定义的DataContext类。这个DataContext类是我们从数据库中查询实体或者进行更改操作的主要渠道。生成的DataContext类将含有一些属性,对应于我们在数据库中建了模的每个数据表,以及一些方法,对应于我们添加的每个存储过程。 例如,下图就是基于我们上边设计的模型而生成的的NorthwindDataContext类: LINQ to SQL 代码例子 用LINQ to SQL 设计器对我们的数据库建模之后,我们就可以很方便地编写代码对数据库进行操作了。下边是一些展示了常见的数据库操作的代码例子: 1) 从数据库中查询Products 下面的代码用LINQ to SQL 查询语法来获取Product对象的IEnumerable序列。注意代码是如何通过Product/Category关系来仅查出那些类别是"Beverages"的产品的: C#: VB: 2) 更新数据库中的一条产品记录 下面的代码示范了如何从数据库中查询出单一的一条产品记录,更新它的价格,然后将改动保存至数据库: C#: VB: 注意:VB在Orcas Beta1中尚不支持Lambda。但是在Beta2中,它就会支持了--那时代码就会能写得更为简洁一些。 3) 向数据库中插入一条新的Category和两条新的Products 下面的代码示范了如何生成一个新的分类,然后生成两条和该分类相关联的产品,然后将这三条记录保存到数据库中。 注意下边,我不用手工去维护主/外键关系,取而代之的是,我只向分类对象的“Products”集合中添加了两个Product记录,然后把该Category对象添加到DataContext的“Categories”集合中,LINQ to SQL将知道自动为我持久适当的PK/FK的关系。 C# VB: 4) 从数据库中删除Products 下面的代码示范了如何从数据库中删除所有的玩具产品: C#: VB: 5) 调用存储过程 下面的代码示范了如何不使用LINQ查询语法,而是通过调用我们在上面向数据模型中添加的“GetProductsByCategory”存储过程来查询Product实体。注意,一旦我查询出了Product结果集,我可以更新/删除它们,然后再调用 db.SubmitChanges()来将这些更新提交到数据库。 C#: VB: 6) 在服务器端分页查询Products 下面的代码示范了如何通过LINQ查询语法实现高效的服务器端数据库分页查询。通过使用下面的Skip()和Take()操作符,我们从数据库中只查询出从200行开始的10条记录: C#: VB: 总结 LINQ to SQL提供了一种很棒的、干净利索的方法来为你的应用程序来建立数据层。一旦你定义了数据模型,你就可以方便而且有效地对它进行查询,插入,更新和删除。 希望以上的介绍和代码例子刺激了你的胃口,希望了解到更多东西。在接下来的几周里我会在该系列中更具体地探讨LINQ......[阅读全文]

posted @ | Feedback (18) | Filed Under [ ASP.NET .NET Visual Studio LINQ Data ]

摘要:【原文地址】 New "Orcas" Language Feature: Anonymous Types 【原文发表日期】 Tuesday, May 15, 2007 7:02 AM 在过去的2个月里,我发表了一系列贴子,讨论作为Visual Studio和.NET框架Orcas版本一部分发布的一些新的语言特性。这里是这个系列里前4个贴子的链接: 自动属性,对象初始化器,和集合初始化器 扩展方法 Lambda表达式 查询句法 今天的贴子讨论我这个语言系列的最后一个新特性:匿名类型。 什么是匿名类型(Anonymous Types)? 匿名类型是C#和VB的方便语言特性,它允许开发人员在代码内简明地定义行内CLR类型,而不用显式地对类型定义一个正式的类声明。 匿名类型在使用LINQ做查询,转换/投影/构形数据时尤其有用。 匿名类型的例子 在我以前的查询句法贴子里,我示范了你可以通过投影来转换数据。这个LINQ的强有力的特性允许你对一个数据源(不管这个数据源是数据库,XML文件还是内存中的集合)做查询操作,然后对查询数据的结果构形成与原先数据源不同的结构或格式。 在我以前的查询句法贴子里,我定义了一个用来代表我转换过后的产品数据的MyProduct类。通过显式地定义MyProduct类,我就有了一个正式的CLR类型契约,我可以很容易地用它来把我自定义结构的产品结果在web服务间或我的应用解决方案中的多个类和程序集间传递。 但有的时候,我只想要在我当前的代码范围内查询和操作数据,我不想要另外正式地定义一个类来代表我的数据,才可以操作数据。在这种情形下,匿名类型非常有用,因为它们允许你在你的代码内,简明地定义一个新类型在行内使用。 例如,假设我使用Orcas中的LINQ到SQL对象关系映射器设计器对Northwind数据库建模,生成下列的类:   然后我就可以使用下列代码来对数据库里的产品数据进行查询,使用LINQ的投影/转换功能将数据结果定制构形成与上面的Product类有所不同的东西。但不是用一个显式定义的MyProduce类来代表从数据库获取的数据行,而是用匿名类型的特性来隐式地定义一个含4个属性的新类型来代表我定制构形的数据,象这样: 在上面的代码里,作为LINQ表达式select子句的一部分,我声明了一个匿名类型,然后由编译器自动生成带4个属性(Id, Name, UnitPrice 和 TotalRevenue)的匿名类型,这些属性的名称和类型是从查询的构形中推断出来的。 然后我使用了C#中的var这个新关键词来指代从LINQ表达式返回的这个匿名类型的 IEnumerable<T> 序列,还在后面代码的foreach语句里,对这个序列进行循环时,用var来指代其中的每个匿名类型实例。 尽管这个句法给了我动态语言一样的灵活性,我还保留了强类型语言的好处 - 包括 Visual Studio中的编译时检查和代码intellisense支持。例如,注意上面,我是如何对返回的产品序列做foreach的,对从LINQ查询推断出的带自定义属性的匿名类型,我还能得到完整的代码intellisense和编译检查。 理解var关键词 Orcas中的C#引进了var这个新关键词,在声明局部变量时可用于替代类型名。 在第一次看见var这个新关键词时,大家常有的一个错误认识是,这是个后期绑定或者无类型的变量引用(譬如,Object类型的引用或象Javascript中后期绑定的对象引用)。这并不正确,var关键词总是生成强类型的变量引用。不是要求开发人员显式地定义变量的类型,var这个关键词而是告诉编译器在变量最先声明时,从用来初始化变量的表达式推断出变量的类型。 var这个关键词可以用来引用C#的任何类型(意即它可用于匿名类型和显式定义的类型)。实际上,理解var这个关键词的最容易的方法是看一下几个将其用于常见显式类型的例子。譬如,我可以象下面这样使用var这个关键词来声明三个变量: 编译器会根据初始赋值推断出name,age和male变量的类型,在这个例子中,分别是字符串,整数和布尔值。这意味着,编译器会生成与下面代码完全一样的IL: 实际上,CLR根本不知道你使用了var这个关键词,从它的角度来看,上面2个代码例子绝对没有区别。第一个版本只不过是由编译器提供的节省开发人员几下键击的语法糖而已,让编译器做苦力推断出和声明类型名称。 除了使用var这个关键词替代内置的数据类型外,很明显地,你也可以将它用于你定义的任何自定义类型。例如,回到我以前博客贴子中的LINQ查询投影例子,这个投影使用了用来数据构形的显式的MyProduct类型,我可以用var这个关键词将其改写为: 重要注意事项:虽然我在上面使用了var这个关键词,我并没将其用于匿名类型。我的LINQ查询还是使用了MyProduct这个类型来对返回的数据做了构形,这意味着var products声明是IEnumerable<Product> products的速记而已。同样地,在foreach语句中我定义的var p变量不过是MyProduct p的速记而已。 var关键词的重要规则 因为var这个关键词产生强类型的变量声明,编译器需要能够根据它的用法推出其类型。这意味着,在用它来声明变量时,你总是需要做个初始赋值。编译器会产生一个编译错误,如果你不这么做的话: 声明匿名类型 至此,我们介绍了var这个关键词,我们可以开始用它来指代匿名类型了。 C#中的匿名类型是使用与我语言系列第一个博客贴子里讨论过的对象初始化句法同样的句法来定义的。其区别是,不是作为初始化语法的一部分来声明类型名称,而是在实例化匿名类型时,你将new关键词后面的类型名称省略掉: 编译器会分析上面的句法,自动定义一个带有4个属性的新的标准CLR类型。这4个属性的类型是根据赋给的初始