有关为 LightSwitch 创建 WCF RIA 服务的准则

本主题提供了创建和使用基于 LightSwitch 的应用程序中的 Windows 通讯基础 (WCF) 富互联网应用程序 (RIA) 服务的指南。本主题提供有关以下任务的信息:

  • 在 RIA WCF 服务的域服务类中存储、 检索和使用连接字符串

  • 在基于 LightSwitch 的应用程序中使用的查询定义方法

  • 将属性应用于实体的字段

有关设计 WCF RIA 服务的更多常规信息,请参见 WCF RIA Services(WCF RIA 服务)。

存储、检索和使用连接字符串

要连接到 WCF RIA 服务的域服务类中的数据,您的代码必须将连接字符串传递给数据源提供程序。连接到该服务时,使用该服务的开发人员可以存储 LightSwitch 应用程序的 web.config 文件中的连接字符串。在 RIA WCF 服务的域服务类中,您的代码可以检索和使用连接字符串。

Gg589479.collapse_all(zh-cn,VS.110).gif存储连接字符串

在连接到 LightSwitch 中的 RIA WCF 服务时,开发人员将提供数据源的连接字符串。将连接字符串保存到 LightSwitch 应用程序的 web.config 文件中有关更多信息,请参见 如何:连接到数据

为了帮助开发人员提供正确的连接字符串,您可以提供描述预期格式的字符串的有用文本。此文本将显示在**“连接数据源向导”“连接字符串”**框中。要提供此文本,向域服务类的顶部添加 DescriptionAttribute 特性。

Gg589479.collapse_all(zh-cn,VS.110).gif检索连接字符串

在 WCF RIA 服务的域服务类中,您的代码可以通过引用域服务类(例如,CustomerNamespace.CustomerService)的完全限定名称从 web.config 文件检索连接字符串。下面的示例通过重写域服务类的 Initialize(初始化)方法来检索连接字符串。如果未找到任何连接字符串,则使用硬编码的连接字符串。

Public Overrides Sub Initialize _
    (context As System.ServiceModel.DomainServices.Server.DomainServiceContext)
    
    If (WebConfigurationManager.ConnectionStrings.Item(Me.[GetType]().FullName) _
        Is Nothing) OrElse [String].IsNullOrWhiteSpace _
    (WebConfigurationManager.ConnectionStrings.Item _
     (Me.[GetType]().FullName).ConnectionString) Then
        
        _connectionString = "data source=NorthwindDB;initial catalog= " _
            & "Northwind;user id=myID;password=myPassword"
    Else
        _connectionString = WebConfigurationManager.ConnectionStrings.Item _
            (Me.[GetType]().FullName).ConnectionString
    End If

    MyBase.Initialize(context)
End Sub
        
string _connectionString;
public override void Initialize
    (System.ServiceModel.DomainServices.Server.DomainServiceContext context)
    {
        if ((WebConfigurationManager.ConnectionStrings
            [(this.GetType().FullName)] == null) || 
            String.IsNullOrWhiteSpace(WebConfigurationManager.ConnectionStrings
            [this.GetType().FullName].ConnectionString))
        {
            _connectionString = "data source=NorthwindDB;initial catalog= " + 
                "Northwind;user id=myID;password=myPassword";
        }
        else
        {
            _connectionString = WebConfigurationManager.ConnectionStrings
                [this.GetType().FullName].ConnectionString;
        }
        base.Initialize(context);
    }

Gg589479.collapse_all(zh-cn,VS.110).gif使用连接字符串

在域服务类中,您可以使用连接字符串连接到您希望的任何方式的数据。但是,在 Visual Studio 中的一些技术要求您以特定的方式使用连接字符串。例如,如果您通过使用 ADO.NET 实体数据模型生成您服务中的实体,则您的代码必须返回 CreateObjectContext 方法中的连接字符串。下面的示例基于您已使用 ADO.NET 实体数据模型的情形来生成您服务提供的实体。本示例将覆盖 CreateObjectContext 方法,并将连接字符串返回到实体框架提供程序。

Protected Overrides Function CreateObjectContext() As NorthwindEntities
    Dim Connection As New EntityConnectionStringBuilder()
    Connection.ProviderConnectionString = _connectionString
    Connection.Provider = "System.Data.SqlClient"
    Connection.Metadata = "res://*/NorthwindModel.csdl|" & _
                 "res://*/NorthwindModel.ssdl|" & _
                 "res://*/NorthwindModel.msl"

    Return New NorthwindEntities(Connection.ToString)
End Function
protected override NorthwindEntities2 CreateObjectContext()
{
    EntityConnectionStringBuilder Connection = new EntityConnectionStringBuilder();
    Connection.ProviderConnectionString = _connectionString;
    Connection.Provider = "System.Data.SqlClient";
    Connection.Metadata = "res://*/NorthwindModel.csdl|" +
                 "res://*/NorthwindModel.ssdl|" +
                 "res://*/NorthwindModel.msl";
    return new NorthwindEntities2(Connection.ToString());
}

定义 LightSwitch 中使用的查询方法

对于您域服务类中的每个实体,必须识别 LightSwitch 可以用于返回实体集合的默认方法。此外,您还可以定义其他返回数据的方法。

Gg589479.collapse_all(zh-cn,VS.110).gif识别默认情况下 LightSwitch 使用的查询方法

LightSwitch 中的所有实体都至少有一种返回集合的方法。此方法将显示在 LightSwitch 中,并使开发人员能够创建显示诸如客户或订单等信息列表的屏幕。您必须确定希望用哪种方法 LightSwitch 用作域服务类中任何指定实体的默认集合方法。要识别此方法,将 QueryAttribute 特性应用到该方法中。在 QueryAttributeIsDefault 属性设置为 True。此方法必须返回 IEnumerable<T> 实体类型或 IQueryable<T> 实体类型。由该方法返回的集合必须包含该实体的所有字段。查询不得接受任何参数。下面的示例将 QueryAttribute 特性应用到 Customers 实体的GetCustomers 查询方法中。

<Query(IsDefault:=True)> _
Public Function GetCustomers() As IQueryable(Of Customer)
    Return Me.ObjectContext.Customers
End Function
[Query(IsDefault=true)]
public IQueryable<Customer> GetCustomers()
{
    return this.ObjectContext.Customers;
}

Gg589479.collapse_all(zh-cn,VS.110).gif创建其他查询方法

可以创建所需数目的查询方法。每个查询方法都可以返回基于添加到该方法的自定义逻辑的一个或多个实体。在 LightSwitch 中,可以运行您的业务逻辑中的这些方法,也可以将其用于在屏幕上显示数据。查询方法必须返回实体类型,或 IEnumerable<T> 实体类型,或 IQueryable<T> 实体类型。方法参数必须为空,并且必须是 LightSwitch 支持的简单类型。有关可以为 null 的类型的更多信息,请参见 可以为 Null 的值类型 (Visual Basic)可以为 null 的类型(C# 编程指南)。有关 LightSwitch 中支持的简单类型的更多信息,请参见 如何:定义数据字段

将属性应用于实体字段

在您的域服务类中,可以将特性应用到实体的字段中。下表提供了有关如何使用特性来实现您要对 LightSwitch 的影响的指导。

特性

在 LightSwitch 中使用此属性

AssociationAttribute

对于一对多关系,将 ThisKey 属性设置为存在于关系一方的实体的主键。

对于零对多或一对多关系,将 ThisKey 属性设置为存在于关系一方(或不存在于任何关系方)的实体的主键。

对于一对零或一对一关系,将 ThisKey 属性设置为存在于关系一方的实体的主键。将 OtherKey 属性设置为存在于零对一关系方的实体的主键。

DisplayAttribute

在 LightSwitch 中,使用 ShortName(短名称)或 Name(名称)属性来指定要显示此字段的名称。使用 Description(描述)属性来指定您希望用户指向包含屏幕中字段的控件时显示为工具提示的文本。

EditableAttribute

在 LightSwitch 中,如果您将 AllowEdit 属性设置为 False,则该字段的“只读”属性将设为 True。

EnumDataTypeAttribute

如果您将 EnumType 属性设置为枚举,则 LightSwitch 将通过枚举的值为字段创建一个选择列表。

KeyAttribute

在 LightSwitch 中,如果您要将字段用作实体的主键,则使用 KeyAttribute 特性。可以指定多个项。

RangeAttribute

使用此特性来设置字段的最大和最小值。此特性已对非数值数据类型没有影响。

RequiredAttribute

在 LightSwitch 中,此属性只影响具有字符串类型的字段。如果您将此特性的 AllowEmptyStrings 属性设置为 False,则在 LightSwitch 中,字段的“必需”属性设置为 True。

ScaffoldColumnAttribute

在 LightSwitch 中,如果您将 Scaffold(脚手架)属性设为 True,则”默认情况下的显示“属性将设为 True

StringLengthAttribute

在 LightSwitch 中,使用 MaximumLength 属性设置该字段的“最大长度”。

StringLengthAttribute

在 LightSwitch 中,如果您应用此特性,则该字段的“默认情况下的显示”属性将设置为 False。

以下特性在 LightSwitch 中没有影响。

  • ConcurrencyCheck

  • DataType

  • DisplayColumn

  • DisplayFormat

  • FilterUIHint

  • MetadataType

  • 正则表达式

  • ScaffoldTable

  • UIHintAttribute