如何为可编辑OData数据源创建RIA Service包

[原文发表地址] How to Create a RIA Service Wrapper for an Editable OData Source

[原文发表时间] 2011-10-11 10:39

简介

LightSwitch内置支持SQL服务器和SharePoint数据源。要访问其他数据源,你要自行编写WCF RIA DomainService。这篇博文会教你如何通过将访问OData Service的方法封装到DomainService的方式来读写OData数据源。

对于那些能用于RIA Services和LightSwitch的OData Services有一些限制条件。

复杂类型

虽然OData和RIA Services都在实体上支持复杂类型,但是LightSwitch并不支持。如果实体上出现复杂类型属性,LightSwitch将会在导入实体时,忽略那个属性。有一些变通的方法可以用来处理这种情况,我们会在其他博文中详细讲这个问题。

无外键的导航属性

OData Service可以包含与外键无关联的导航属性。这差不多就是多对多关系,不过也可能出现0.1到多或者1到多的关系。比如,Netflix OData Catalog在Title和Genre间包含一个多对多关系。不幸的是,RIA Service的关联是基于外键的。如果一个OData的关联不是基于外键的话,那么通过RIA Service就没有很好的诠释方法了。

如果一个OData Service包含了这类关联,那么在LightSwitch中就会没有现存的方法来表示。不过,你可以在RIA Service上添加带参数的查询,它可以被LightSwitch调用。使用这个功能,查询就能代表这些不被支持的关联能被实现了。对Netflix来说,例如,你可以在RIA Service上定义查询GetGenresByTitle和GetTitlesByGenre,它可以调用特定的OData导航属性。

为LightSwitch创建OData DomainService包的基本步骤如下:

  1. 创建一个类库项目
  2. 添加与OData Service相关的服务
  3. 为项目添加WCF DomainService
  4. 添加一个metadata类为LightSwitch提供关于引用的Service所实现的类的特定信息。
  5. 为你的DomainService添加查询函数,去显示OData Service上的每个实体类
  6. 为你的DomainService添加函数来实现创建,更新,删除每一个实体类

步骤1-5在如何为OData数据源创建RIA Service包博文中都涉及到了。这篇博文会继续详细介绍并更新在那个博文中所创建的DomainService。

允许LightSwitch指定连接信息

第一篇博文假定OData Service的地址在你的DomainService中是硬编码的。我们现在将修改我们的类来实现在LightSwitch中使用RIA Service时可以指定地址。

LightSwitch中的Add Data Source向导会提示开发者在添加DomainService数据源时需要一个连接字符串。这个连接字符串会以DomainService的类名储存于web.config文件中为项目所用。我们将会修改我们的DomainService使它在初始化时从web.config文件中获取连接信息。

首先添加引用到System.Web和System.Configuration。

clip_image001[4]

为DomainService类添加描述属性。这个描述会在Add Data Source向导中显示,当需要用户输入连接字符串时。

<Description("Specify the address to the ProductCatalog Service")> _

    Public Class ProductService

Inherits DomainService

修改初始化函数来检测使用LightSwitch所指定地址。

Public Overrides Sub Initialize(ByVal context As System.ServiceModel.DomainServices.Server.DomainServiceContext)

MyBase.Initialize(context)

‘Get connection information from the web.config

If Web.Configuration.WebConfigurationManager.ConnectionStrings(GetType(ProductService).FullName) Is Nothing OrElse String.IsNullOrWhiteSpace(Web.Configuration.WebConfigurationManager.ConnectionStrings(GetType(ProductService).FullName).ConnectionString) Then

Throw New Exception("The address to RIA Service must be provided when attaching to this data source from LightSwitch.")

Else

Dim url As String = Web.Configuration.WebConfigurationManager.ConnectionStrings(GetType(ProductService).FullName).ConnectionString

_context = New ProductCatalog.ProductCatalogEntities(New Uri(url))

End If

    End Sub

RIA Service提供Submit 函数

DomainService的Submit函数会在LightSwitch每次要保存和修改数据源时被调用。Submit函数需要处理每一个变更的实体,然后把改动保存到OData Service。

在我们的OData Service中,每个Product都有与之相关的Category。要确保Product和Category之间的关系正确,我们的RIA Service需要优先处理Categories。通过按优先级重新排列变更实体集,然后去处理它们就可以实现了。这个重新排序需要基于每个OData Service的结构来自定义。下列类会处理变更集的排序。

Public Class ProductEntitiesComparer

Inherits Comparer(Of Object)

     Public Overrides Function Compare(x As Object, y As Object) As Integer

If TypeOf x Is ProductCatalog.Product AndAlso TypeOf y Is ProductCatalog.Category Then

Return 1

ElseIf TypeOf x Is ProductCatalog.Category AndAlso TypeOf y Is ProductCatalog.Product Then

Return -1

Else

Return 0

End If

End Function

    End Class

一旦变更集被重新排序,我们就要对变更集中的每一条记录进行处理。通过调用Submit的基类,就能实现这点。Submit的基类简单地针对每一个实体类型分别调用Update,Create和Delete函数。我们会在之后提供这些函数。

在每个记录都处理之后,我们需要在OData Service中保存这些更改。介于一个特定保存可以包括多个记录,这些记录都互相联系,因此我们要用批量模式进行保存。

Public Overrides Function Submit(changeSet As ChangeSet) As Boolean

‘Reorder the change set to ensure that categories are processed before products. Products are dependent on categories.

Dim c As New ChangeSet(changeSet.ChangeSetEntries.OrderBy(Function(entry) entry.Entity, New ProductEntitiesComparer()))

Dim baseResult As Boolean = MyBase.Submit(c)

_context.SaveChanges(Services.Client.SaveChangesOptions.Batch)

Return True

End Function

Category提供CreateUpdateDelete函数

对每一个函数,我们首先要把Category添加到DataServiceContext对象上。对Update和Delete函数,我们还要指定附加对象所发生的操作是什么。函数如下所列:

Public Sub CreateCategory(ByVal c As ProductCatalog.Category)

‘Add the new category to the service reference context

_context.AddObject("Categories", c)

End Sub

Public Sub UpdateCategory(ByVal c As ProductCatalog.Category)

‘Attach the object to the context and specify that it has been updated

_context.AttachTo("Categories", c)

_context.UpdateObject(c)

End Sub

Public Sub DeleteCategory(ByVal c As ProductCatalog.Category)

‘Attach the object to the context and specify that it has been deleted

_context.AttachTo("Categories", c)

_context.DeleteObject(c)

End Sub

Product提供CreateUpdateDelete函数

这些函数和为Category而设的函数很相似。不过,对CreateProduct函数来说,我们需要告知DataServiceContext,在Product和Category之间有一定的关系(连接)。这样就能保证新添加的Product可以正确地与Category相关连。在单边关系中,这个步骤是必要的。

Public Sub CreateProduct(ByVal p As ProductCatalog.Product)

‘Add the new product to the service reference context

_context.AddToProducts(p)

‘Need to set link between Product and Category (to ensure that inserts to the database are ordered correctly)

‘For existing categories, get the category first

If p.Category Is Nothing Then

p.Category = _context.Categories.Where(Function(c) c.ID = p.CategoryID).FirstOrDefault()

End If

‘Set the link between the product and category

_context.SetLink(p, "Category", p.Category)

End Sub

Public Sub UpdateProduct(ByVal p As ProductCatalog.Product)

‘Attach the object to the context and specify that it has been updated

_context.AttachTo("Products", p)

_context.UpdateObject(p)

End Sub

Public Sub DeleteProduct(ByVal p As ProductCatalog.Product)

‘Attach the object to the context and specify that it has been deleted

_context.AttachTo("Products", p)

_context.DeleteObject(p)

End Sub

总结

这个函数可以扩展到OData Service中,任意多种实体类型都可以。唯一需要做的修改就是Submit和Create <Entity>函数。在Submit函数中,变更集需要重新排序,来保证父类在子类前被处理。在Create <Entity>函数中,实体类型间的连接需要指定单边,或子边的关系。

希望你们喜欢!

新示例库中的LightSwitch示例

[原文发表地址]LightSwitch Samples on the new Samples Gallery

[原文发表时间] 04-19-2011 6:37 PM

几个月之前MSDN为代码示例发布了一个新的网站,在这里产品团队和社区能够分享代码。我们已经把团队的示例放在那个网站上了,查看下LightSwitch团队的作者:

下载LightSwitch 团队示例代码

这是目前我们已经放到这个网站上面的示例的描述:

·
VisualStudio LightSwitch 眼科诊所案例介绍和示例此示例演示了在Visual
Studio LightSwitch中创建应用程序的从头至尾的过程,并在文档中提供了演示步骤。您可以使用LightSwitch的多项功能来为虚拟的眼科诊所创建一个提供预约和创建票据的应用程序。这是学习LightSwitch的一个很好的开始。

  • LightSwitch
    Course Manager 端到端应用程序
    – Course
    Manager是一个Visual Studio
    LightSwitch Beta 2示例项目。它是一个完整的业务线(LOB)应用程序,旨在演示LightSwitch中的许多自带功能。
    Andy Kung 也已开始写一系列的博客来详述他如何创建它的.

·
VisualStudio LightSwitch中的Excel ImporterExcel ImporterVisual Studio LightSwitch Beta 2的扩展示例。扩展性可以添加将Excel中的数据导入到LightSwitch应用程序的新功能。Importer会验证数据是否被导入,甚至能越过关联导入数据。你只需安装LightSwitch来使用Excel Importer。但是此示例演示如何建立自己的扩展,以便生成扩展示例代码,你需要安装Visual Studio 2010 Professional, ServicePack 1, VisualStudio SDK LightSwitch

·
LightSwitch Active Directory Sample这个演示应用程序是一个VisualStudio LightSwitch Beta 2示例项目。它是一个原型应用程序,用来演示如何在LightSwitch中使用Active Directory数据。这个代码在 9频道对Mike的采访曾经做过演示。

社区也会加入这个网站!更多信息请参阅Visual Studio LightSwitch 标记

下载 LightSwitch社区示例

我们还有很多计划,请保持关注。我们还会在开发人员中心上创建一个“专题示例”页面,我们会挑选这里的社区示例放入到专题里。有创建LightSwitch示例的很酷的想法吗?把他们发表到Sample Gallery上,并标注为Key Technology = Visual Studio LightSwitch,也许您的示例将会出名哦!🙂

用得开心。

CodeCast Episode 104: Visual Studio LightSwitch with Beth Massi

[原文发表地址] CodeCast Episode 104: Visual Studio LightSwitch with Beth Massi

[原文发表时间]12 Apr 2011 12:55 PM

今天我早早就起床了,因为要做我的一个老朋友Ken Levy关于Visual Studio LightSwitch的电话采访。我们聊了关于LightSwitch是什么的话题以及它的用途,Beta2的最新功能,部署方案(包括云部署),和可扩展性模型的快速介绍。在这些事上我总是相当直率,这次也没例外——我度过了一段很棒很欢乐的时间。谢谢Ken!

请查阅:CodeCast Episode 104: Visual Studio LightSwitch with Beth Massi (长度47:44分钟)

相关链接:

· LightSwitch开发人员中心-http://msdn.com/lightswitch

· LightSwitch团队博客-http://blogs.msdn.com/lightswitch

如果您喜欢播客的话,这是几个与团队相关的视频播客:

用得开心!

第9频道采访 :LightSwitch实际应用程序演练

[原文发表地址] Channel 9 Interview: Walkthrough of a Real-World LightSwitch Application (Mike Droney, Sheel Shah, Beth Massi)

[原文发表时间] 17 Mar 2011 1:55 PM

在这个视频中,我采访了两个LightSwitch 团队成员,Mike Droney (测试人员) 和Sheel Shah (项目经理),他们为我们演示了一个方便管理员管理开发部门间的硬件资产的实际应用程序。Mike和Shell谈论了应用程序的需求收集、开发流程以及应用程序的一些高级功能。他们能够在很短的时间内建立工作原型,并随后用于迭代开发方法来添加越来越多用户所期待的功能。LightSwitch让他们专注于业务价值和用户的生产效率,不必担心构建有很多高级功能——包括通用报表生成器——的现代Silverlight应用程序、n层应用程序所需经历的麻烦。

观看:在微软演练一个实际LightSwitch应用程序

(提示: 为更清晰地看到应用程序和代码,请选择观看高清WMV

他们的应用程序基于LightSwitch Beta 2,今天开始供大家下载!请访问 LightSwitch开发中心下载并开始学习LightSwitch。如果想得到更多关于LightSwitch 的资源请访问 LightSwitch团队博客 和在 LightSwitch论坛提问。

好好欣赏!
-Beth Massi

LightSwitch Beta 2内容汇总

[原文链接]:LightSwitch Beta 2 Content Rollup

[原文作者]:Beth Massi

Visual
Studio LightSwitch Beta 2发布了
已经十天了。我们正在非常努力地更新所有示例、“How Do I”视频、文章和博客来体现Beta
2的更改。对,就是这样。 我们将遍历并更新我们所有的博文,这样大家以后读到它们的时候就不会觉得困惑了。你们将在博文的上部看到注解信息说明是否只适用于Beta1还是已经被更新至适用于Beta2(如果没有注解,则表示二者都适用)。看一看那些博文吧,很多技术都已经改变了。我尤其推荐你们去重看一下“How Do
I”视频

那么,这些是已经被团队完成、审阅或完全重新更新的Beta 2内容汇总。你们可以在新的LightSwitch学习中心发现所有这些内容都被很好地划分为:起步内容、基本内容、高级内容。我们每周都有新的内容!

开发者中心

How Do I”视频:

#1如何在LightSwitch
应用程序中定义我的数据?

#2 如何在LightSwitch应用程序中创建搜索界面?

#3 如何在LightSwitch应用程序中创建编辑详细信息界面?

#4 如何在LightSwitch应用程序中的界面上格式化数据?

#5 如何在LightSwitch应用程序中的界面 上排序和筛选数据?

#6如何在LightSwitch应用程序中创建主从(1对多)界面?

#7 如何在LightSwitch应用程序中从命令栏往界面中传入参数?

#8 如何在LightSwitch应用程序中为验证和字段验证 编写商业规则?

#9 如何在LightSwitch应用程序中创建能够编辑和添加记录的界面?

#10 如何在LightSwitch应用程序中创建和操纵查阅列表?

#11 如何在LightSwitch应用程序中设置安全性将用户权限控制在局部?

 

博客:

数据

界面

  • 如何在LightSwitch中创建含多个搜索参数的界面
  • 在Visual
    Studio LightSwitch中创建一个定制的搜索界面
  • 如何编程控制LightSwitch
    用户界面

查询

Office

部署

 

小技巧
&
疑难问题

安全性

架构

定制和扩展

示例:

培训

Channel 9

用的开心!(回去干活了…)

<a
href=”//flagcounter.com/more/cWf”><img
src=”//flagcounter.com/count/cWf/bg=FFFFFF/txt=000000/border=CCCCCC/columns=2/maxflags=12/viewers=0/labels=1/pageviews=1/”
alt=”free counters” border=”0″></a>