数据服务

访问内部部署或在使用 ADO.NET 数据服务数据

Elisa Flasko

代码下载可从 MSDN 代码库
浏览代码联机

这篇文章基于 Windows Azure 和 ASP.NET MVC 的预发布版本。

本文讨论:

  • Windows Azure
  • ASP.NET MVC
  • Windows Azure 表
  • 内部部署与云形标应用程序开发
本文涉及以下技术:
Windows Azure,ASP.NET MVC

内容

应用程序
使用与 ADO.NET 数据服务客户端库的终端数据服务
查询数据
创建,更新,和删除
使用 Azure 的表数据服务
Azure 表数据模型
ADO.NET 数据服务客户端库
客户端上定义模型
创建表
查询数据
创建,更新,和删除
设置汇总

Web 服务已 热主题的年现在,但是,您可能想大是每个人的讨论这些数据服务?应用程序已更改为 Web 的体系结构也 matured (具有 Rich Internet 应用程序 [RIA],例如的普及),没有公开任何接口减去的原始数据的值的增加的识别要任何服务或应用程序格式想要使用。数据服务的简单数据中心服务与一个 RESTful 的接口执行完全的由应用程序公开的消耗纯数据。此类服务公开供 Web 客户端通过公司 Intranet 或 Internet 中使用统一的接口的数据。数据服务可以生成位于您的在场使用 ADO.NET 的数据服务服务器库作为一种服务安全地公开数据和可能可用不同的托管服务,如 Windows Azure 表。Windows Azure 是 Microsoft 群平台的基础。在"为操作系统群",它提供您需要编写可伸缩性和高可用性服务基本构建基块。主要组成部分 Azure,Windows Azure 表,允许用户保存在数据,并公开作为数据服务将存储的数据。

无论数据服务驻留在 ADO.NET 数据服务框架将提供针对一个范围的 Microsoft 开发平台 (.NET、 Silverlight、 ASP.NET AJAX 和等等) 使您可以轻松地使用应用程序中的这些服务的客户端库一个组。

fig01.gif

图 1 由 Micro 客数据服务公开的实体数据模型

应用程序

在整篇文章,我将会生成一个简单的 Micro 客应用程序,使用 ASP.NET 模型视图控制器 (MVC) (预发布版本),并将详细描述构建这样的基于服务的应用程序时出现的常见情况的一些。我将假定 MVC 一个之前了解,并因此不讨论此模式的细节。如果需要有关 ASP.NET MVC 的详细信息,请参阅在ASP.NET MCV 网站. 为了进行比较,我将介绍同一基本应用程序的两个版本,一个使用的在场的数据服务,另一个使用一个 Azure 表数据服务。为两个版本的此代码包含随附的代码下载中。

Micro 客应用程序允许用户张贴消息到特定频道、 创建新通道,以及查看其感兴趣的频道上的邮件。已经被公开数据服务,为此应用程序由三种类型的实体组成的模型: 邮件、 频道和具有很大程度上的一对一映射到数据库的用户。值得注意到目前为止与在场的数据源,此模型包含的实体之间的关系的一级概念。消息由单个用户发布到特定频道 (请参见 图 1 )。

使用与 ADO.NET 数据服务客户端库的终端数据服务

让我们首先创建一个新的 ASP.NET MVC Web 应用程序,使用随 ASP.NET MVC Visual Studio 模板。

有可以转有关定义类以表示该模型在客户端上的两种主要方法。您只是可以通过定义将在客户端上用来代表我开发此应用程序对 Windows Azure 表,或可以使用添加服务引用向导在 Visual Studio 中生成所需的类时,我将执行该服务所公开的实体的 POCO (普通旧 CLR 对象) 类定义模型。为时用于添加服务引用一个 Windows Communication Foundation (WCF) 服务,您只需右击该项目并选择添加服务引用。在添加服务引用对话框输入该的地址在服务的入口点的 URI,然后单击确定。这将生成基于该数据服务定义这些关联的类并将它们添加到项目。

图 2 所示,添加服务引用向导生成类为每个我的实体: 通道、 信息,用户,以及类表示服务作为一个整体,microblogEntities。类 microblogEntities 继承 DataServiceContext,将能作为起始点访问数据服务。

fig02.gif

图 2 类表示 Micro 客模型

查询数据

与现在设置应用程序来访问数据的服务我可以启动开发我的应用程序的其余部分。在的主页上应用程序将提供可用的频道的列表,并允许用户通过选择一个通道查看今天的邮件。用户还能够根据作者该频道中的筛选。若要创建主页,我需要在将映射到索引视图 (的主控制器和索引视图默认情况下创建 MVC 模板中) 的主控制器中创建一个 ActionResult。在的主页上我将需要从数据服务中检索所有可用的频道的列表,以及查询筛选的当前邮件服务根据用户输入 (请参见 图 3 )。

fig03.gif

图 3 站点 HomePage

ADO.NET 数据服务客户端库使您能够轻松地查询数据的语言集成查询 (LINQ),使用如所示图 4 .

主页由浏览器访问,并返回将用于显示 index.aspx 视图的数据时,将由 MVC 应用程序调用主页控制器的索引操作。实例在 图 4 ,索引操作中我化一个新的实例在 DataServiceContext microblogEntities 像下面这样:

microblogEntities svc = new microblogEntities(new Uri("http://localhost:50396/MicroData.svc"));

图 4 与使用 LINQ 的.NET 对象访问数据

public ActionResult Index(string channel, string author)
    {
        microblogEntities svc = new microblogEntities(new 
        Uri("http://localhost:50396/MicroData.svc"));
        ViewData["channels"] = svc.Channels;

        int y = DateTime.Now.Year;
        int mm = DateTime.Now.Month;
        int d = DateTime.Now.Day;

        var q = from m in svc.Messages.Expand("Author").Expand("Channel")
                where m.Channel.ChannelName == channel && (m.DatePosted.Year == y && 
                m.DatePosted.Month == mm && m.DatePosted.Day == d)
                select m;

        if (!string.IsNullOrEmpty(author))
        {
            q = from m in q
                where m.Author.UserName == author
                select m;
        }

        ViewData["msg"] = q;

        return View();
    }

这是,我将使用每次我想要按服务对象。 第一次对数据服务将执行的查询访问所有可用信道。 第二个在 LINQ 查询检索的所有用户命中页和作者的筛选器,如果提供一个名称时所申请的频道中的邮件。 请注意在提供的示例代码,通过输入通道名称查看邮件并,如果需要,作者的姓名文本框和然后单击查看。 它也是值得注意查询需要一个 ChannelName;,搜索无法执行单独的作者名。 我会将这两个上述查询放入 ViewData 来呈现页面时将执行并返回中。

现在,在的主页 Index.aspx 的视图中我将实际枚举该的查询有效地到目前为止执行对存储查询而将然后打印结果页 (,请参见 图 5 ).

图 5 主页视图 (终端服务)

<h2>Today's Messages</h2>
    <form action="./">
        Channel:<span style="color: #FF0000">*</span> <input type="text" 
            name="channel" 
            />          
            Author: <input type="text" name="author" /><br />
        <input type="submit" value="Search" />
    </form> 
    <ul>
    <!-- Execute query placed in ViewData["msg"] - enumerates over 
        results and prints resulting message data to the screen -->
    <% foreach (var m in (Ienumerable
        <MicroBloggingOnPremise.Models.Message>)
    ViewData["msg"])
       { %>
    <li><%=m.Author.UserName%>@<%=m.DatePosted %>: <%=m.Text%> 
        [<%=m.Channel.ChannelName %>]</li>
    <%} %>
    </ul>



    <h2>Channels</h2>
    <ul>
    <!-- Execute query placed in ViewData["channels"] - enumerates over 
         results and prints resulting channel data to the screen -->
        <% foreach (var channel in 
        (IEnumerable<MicroBloggingOnPremise.Models.Channel>)
            ViewData["channels"])
           { %>

          <li><%=channel.ChannelName %> (<%=channel.DateCreated %>)</li>

        <% } %>
    </ul>

创建,更新,和删除

若要创建新的实体实例数据服务使用在 ADO.NET 中数据服务客户端库,我创建该.NET 对象,它代表的实体组的一个新实例,调用 AddTo… 方法实体我使用,并将新对象传递和实体设置我将添加到该 DataServiceContext 实例上设置的。

是例如一下在主页控制器的 PostMessage 操作中 图 6 我尝试将邮件张贴通过单击发送按钮时调用的。

图 6 (在终端) 创建新消息和推送到数据存储区

[AcceptVerbs("POST")]
        public ActionResult PostMessage(string channel, string author, 
            string msg)
        {
            microblogEntities svc = new microblogEntities(new 
            Uri("http://localhost:50396/MicroData.svc"));

            Channel chan = (from c in svc.Channels
                    where c.ChannelName == channel
                    select c).FirstOrDefault();


            if (chan == null) throw new ArgumentException("Invalid 
                channel");

            User u = (from auth in svc.Users
                     where auth.UserName == author
                     select auth).FirstOrDefault();

            if (u == null) //throw new ArgumentException("Invalid 
                Author");
            {
                //To simplify this example we will create a new user, 
                //if the user was null when we queried. 
                //It is possible that another client creates 
                //the same UserName 
                //before we call SaveChanges() 
                //and we end up with 2 Users with the same name
                var user = new User();
                user.UserName = author;
                user.DateCreated = DateTime.UtcNow;
                svc.AddToUsers(user);
                u = user;

            }


            var m = new Message();

            m.DatePosted = DateTime.UtcNow;
            m.Text = msg;
            svc.AddToMessages(m);
            svc.SetLink(m, "Channel", chan);
            svc.SetLink(m, "Author", u);

            try
            {
                svc.SaveChanges();
            }
            catch (Exception e)
            {
                throw (e);
            }
            return this.RedirectToAction("Index");
        }

请注意该方法用修饰该 AcceptVerbs("POST") 属性因为我们的窗体张贴内容来使用。 重新启动通过实例化为最条目的新 DataServiceContext 指向我的服务,然后我查询为要检查它存在指定的通道。 如果通道没有,我引发异常,; 否则,我创建在输入的用户在数据中传递的新邮件。 在创建邮件后我需要告诉上下文我有一个新的对象来调用 svc.AddToMessages(m) ; 被添加新的邮件对象中传递 m。 我还会设置表示附加到在此例 svc.SetLink(m,"channel", chan) 此新邮件的关系的链接 ; 该邮件关联指定的通道和 svc.SetLink(m,"author", u) ; 与指定作者关联邮件。 最后,我想要通过调用 svc.SaveChanges(); 推所做的更改到服务和到数据库。

如果我已修改现有实例而不是创建一个新,我将第一次查询我想要更新,该对象执行所需的更改,而不是 AddToMessages,我将调用 UpdateObject 方法向上下文指明它需要发送下一次的更新该对象调用 SaveChanges()。 同样,如果我有对象后,我已删除实例,我将调用 Delete 方法指示上下文我要删除的对象。

在本示例,并为止本文中,您已经了解到单个 HTTP 请求被发送到该服务在客户端映射上的一次操作。 在许多的情况下也很有用供客户端能够批处理操作的一组,并将其发送到单个的 HTTP 请求中服务。 这样减少到服务的往返行程的数量,并使操作的一个逻辑范围的原子性。 ADO.NET 数据服务向服务通过调用 SaveChanges() 方法,作为唯一参数进行传递 SaveChangesOptions.batch 的单个 HTTP 请求中发送插入、 更新,和/或删除操作的一组客户端库支持。 此参数值指示客户端批处理到单个 HTTP 请求发送到服务的所有挂起的更改。 通过作为批处理发送更改,您请确保将成功完成所有更改,或将应用任何更改。

使用 Azure 的表数据服务

在开发.NET 应用程序使用 Windows Azure 表时将使用 ADO.NET 数据服务客户端库访问数据。 本节中, 我将介绍上面,使用到同一个简单应用程序的开发但这次我将能访问并操作存储在 Azure 表中的数据。 有关本文的其余部分我可以假定 Windows Azure 存储帐户已设置最并可供您使用。 有关在开始使用 Windows Azure 表详情请参阅在 azure Services 平台开发人员中心.

Azure 表数据模型

开始在应用程序之前, 有两个操作必须了解 Azure 表数据模型,以获得最佳性能。 应用程序可以选择创建存储帐户,其中每个表包含一组实体 (行),而每个实体包含一组属性 (列) 中的多个表。 每个实体能够具有最多 255 个属性,存储为 < 名,TypedValue > 对并标识使用两个密钥属性一起成为唯一的 ID。 此第一个的主要属性是 PartitionKey (类型字符串),可伸缩性,和其他启用分区 RowKey (还类型字符串) 来唯一标识该实体在分区内。 在两个的主要属性超出为其余属性表示应用程序负责实施必须维护的任何架构没有固定的架构。

针对 Windows Azure 表与本地数据库存储进行开发时重要的区别之一将分区。 与 Azure 表,应用程序控制的分区,粒度,并分区变得非常重要性能和可伸缩性的应用程序。 也就是说 PartitionKey 属性的选择是非常重要,而影响性能,因为表群集具有相同的分区键值的实体 (实体位置)。 若要选择 PartitionKey 最佳,则应选择项,这样很常见大多数 (或全部) 在应用程序中使用的查询。 性能和可伸缩性可能也会受到同样由应用程序 (在 PartitionKey 中的不同值的数目) 的分区数 ; 有更多分区允许服务器以更好的平衡负载在节点上。

ADO.NET 数据服务客户端库

现在我将生成相同 Micro 客应用程序,使用 ASP.NET 模式视图控制器 (MVC),和这一次我将详细说明的一些构建应用程序对存储在 Windows Azure 表中的数据时通常出现的问题。

与我的在场数据库,这将需要我模型我将转换三个表中的三个实体: 消息表、 一个频道表和用户表,我的存储科目中设置。

整个应用程序,我将使利用在 StorageClient Windows Azure SDK 中附带的示例。 StorageClient 示例实现了可用于访问 Windows Azure Blob 存储服务、 队列服务,和表存储服务的库。 我将使用库可以帮助我访问表存储服务。 从 Azure 服务平台开发人员中心前面提到,可以下载 Windows Azure SDK。

若要开始中,,我将创建一个新的 ASP.NET MVC Web 应用程序,使用随 ASP.NET MVC,Visual Studio 模板,并 Windows Azure SDK 中的 StorageClient 项目添加到解决方案。

客户端上定义模型

生成应用程序在第一步是定义将在客户端上用来代表由服务公开的实体的类。 由于 Azure 表不包含固定的架构,我在我那样的在场服务不能使用添加服务引用向导。 但是,如上所述我,我可以创建自己的 POCO 类。 这些类将有效地用于定义应用程序,架构为 Azure 表不实施服务器端的任何架构。 我将定义邮件类、 一个频道类和用户类别,与由服务公开的 EntityTypes 对齐。 若要开始,我将一个新的代码文件 MicroData.cs,添加到模型文件夹,我将定义我的类。 将是 MicroBloggingAzure.models 命名空间中定义这些类。

如果您看一看 图 7 所示,邮件类,您可以看到我有所需的 Azure 表定义一个 PartitionKey 和一个的 RowKey。 这是从内容您看到的在场服务中因为它们是特定于 Windows Azure 表的出发。 值得注意是通过关系不建议使用的密钥确定最佳实践和云形标存储,和,我最多使用我的示例应用程序中适当的密钥确定对于每个数据源而试图对齐两个以任何方式。 PartitionKey 和 RowKey 是只是定义为类型字符串和标识使用命名约定,调用它们 PartitionKey 和 RowKey) 的。 在此应用程序的情况下,PartitionKey 组成该邮件过帐到,连接的"@"和日期邮件过帐格式"该频道的名称 yyyy-mm-dd"。 在 RowKey 是邮件的过帐日期的字符串表示形式。 此 PartitionKey 选择的应用程序可以有效地检索了最近发布到特定频道的邮件。 为开始时我已选择将仅显示今天的张贴内容访问通道时 ; 但是,如果我的应用程序变得非常受欢迎,并收到成千上万的一天的张贴内容,此项可以轻松地修改分区更多地) 是例如通过添加时组件 (小时可能)。 同样,如果我的应用程序不是为预期为忙的我未能修改分区 PartitionKey 按月而不是一天。 然后,我有两个主要属性标识为这通过向类添加 DataServiceKey 属性一个唯一标识 DataServiceKey。 邮件类还定义了许多其他属性包含有关该邮件,所需的项的一部分的信息。 所有与该邮件实体相关联的属性将存储 Azure 表中。 在用户和频道类会创建以下要素为邮件类。

图 7 消息实体定义

[DataServiceKey("PartitionKey", "RowKey")]
    public class Message
    {
        // ParitionKey is channel name [+ day]
        public string PartitionKey { get; set; }
        // Date/Time when the message was created
        public string RowKey { get; set; }

        public string Text { get; set; }
        public string Author { get; set; }
        public string Channel { get; set; }
        public DateTime DatePosted { get; set; }
        public int Rating { get; set; }

        public Message()
        {
        }

        public Message(string channel, string author, string text)
        {
            this.Text = text;
            this.Author = author;
            this.Channel = channel;
            this.DatePosted = DateTime.UtcNow;

            this.PartitionKey = MakeKey(this.Channel, this.DatePosted);
            this.RowKey = System.Xml.XmlConvert.ToString(
               this.DatePosted);
        }
        public static string MakeKey(string channel, DateTime dt)
        {
            return channel + "@" + dt.ToString("yyyy-MM-dd");
        }
    }

创建表

一旦定义了我的实体类,我可以开始真正开发应用程序。 但首先,我需要下面看到 Web.config,添加我的 Azure 表帐户访问信息:

<appSettings>
  <add key="TableStorageEndpoint"        value="http://table.core.windows.net/"/>
  <add key="AccountName" value="<MyAccountName>"/>
  <add key="AccountSharedKey" value="<MyAccountSharedKey-Provided when        you register for Azure Tables>"/>
</appSettings> 

尽管这不是在针对 Azure 表进行开发时传递帐户信息的唯一方法,这将允许我使用 Azure SDK 自动选取我的帐户设置并处理到数据源的连接。

通常在针对 Windows Azure 表编写的应用程序,应用程序所需的表的创建完成以编程方式应用程序中。 这与有点不同方式一通常会执行与在场的数据存储,在数据库中的表创建单独,以及与它们只是交互应用程序的操作。

创建所需的表的一种方法以编程方式会只是在主表中创建新实体调用表。 在您的存储帐户创建的每个表必须表示为预定义注册您的帐户时,主表中的实体。 为此应用程序,但是,我将使用在 StorageClient,提供了检查此存储帐户中的所需的表的应用程序初始化时的功能并如果它们不存在创建它们。

通过创建表在应用程序中以编程方式,我可以简化的我可以反映到数据存储区中模型的更新过程。 是例如如果下在出差我中添加用户订阅一个的频道并向模型添加一个订阅实体在功能,关联的表将自动添加到数据存储在下次应用程序启动的时。 此选项还确保如果应用程序分发用于不同 Azure 表帐户,用户需要执行所有输入他或她的帐户访问信息且正确设置表并供使用,运行该应用程序时。

如果 Azure 希表中已具有现有数据,或者您 Azure 中没有表控制,可以跳过完全创建表的步骤和只是针对现有的表。

检查,并在我的应用程序中创建表,我将使用 TableStorage.CreateTablesFromModel() 方法是该 StorageClient 库的一部分,此处看到:

protected void Application_Start()
{
       RegisterRoutes(RouteTable.Routes); //MVC Routing Rules

       TableStorage.CreateTablesFromModel (typeof(Models.MicroData));
}  

查询数据

使用设置为访问我的帐户 Azure 表中的 My App,它的其余部分只是为如果效果我已访问的在场的服务。 就像与我的在场服务中,因为我使用 ADO.NET 数据服务客户端库我能够轻松地使用我的数据,为.NET 对象,并使用 LINQ 查询 (请参见 图 8 )。

图 8 作为再次使用 LINQ 的.NET 对象访问数据

public ActionResult Index(string channel, string author)
        {
            var svc = new Models.MicroData();
            ViewData["channels"] = svc.Channels;

            var q = from m in svc.Messages
                    where m.PartitionKey == Models.Message.
                       MakeKey(channel, DateTime.UtcNow)
                    select m;
            if (!string.IsNullOrEmpty(author))
            {
                q = from m in q
                    where m.Author == author
                    select m;
            }

            ViewData["msg"] = q;

            return View();
        }

图 8 ,您会看到主页控制器的索引操作。 在此操作,我实例化我 DataServiceContext 的新实例 (MicroData 继承 TableStorageDataServiceContext),对象我使用来访问该的服务并编写对数据服务执行查询。 然后检索数据服务的所有可用的频道的列表并编写 LINQ 查询以检索所有筛选的今天的邮件根据 (通道和可能作者如果提供) 的用户输入。 我将放置到 ViewData 来呈现页面时将执行并返回这两个查询。 请注意此模式是相同时,我访问的在场数据源,,我实例化一个新的 DataServiceContext 实例,并使用简单 LINQ 查询,对我的模型进行查询。

我的主页 (Index.aspx 中的视图中 图 9 ),我枚举我的查询执行对在的存储查询而打印到页面结果。

图 9 主页视图

<h2>Today's Messages</h2>
    <form action="./">
        Channel:<span style="color: #FF0000">*</span> <input type="text" 
        name="channel" /><br />
        Author: <input type="text" name="author" /><br />
        <input type="submit" value="View" />
    </form> 
    <ul>
    <!-- Execute query placed in ViewData["msg"] - enumerates over 
         results and prints resulting message data to the screen -->
    <% foreach (var m in (IEnumerable<MicroBloggingAzure.Models.Message>)
       ViewData["msg"])
       { %>
    <li><%=m.Author%>@<%=m.DatePosted %>: <%=m.Text%> [<%=m.Channel %>]
    </li>
    <%} %>
    </ul>


   <h2>Channels</h2>

    <ul>
    <!-- Execute query placed in ViewData["channels"] - enumerates over 
    Results and prints resulting channel data to the screen -->
        <% foreach (var channel in 
        (IEnumerable<MicroBloggingAzure.Models.Channel>)
        ViewData["channels"])
        { %>

          <li><%=channel.PartitionKey %> (<%=channel.DateCreated %>)</li>

        <% } %>
       </ul>

创建,更新,和删除

在表服务使用 ADO.NET 数据服务客户端库中创建新实体,就像我正在处理对一个的在场存储,是通过创建.NET 对象代表的实体组的一个新实例和调用 AddObject()。

让我们看中的我的主页控制器 PostMessage 操作 图 10 .

图 10 中创建新邮件和推送到数据存储区

[AcceptVerbs("POST")]
        public ActionResult PostMessage(string channel, string author, string msg)
        {
            var svc = new Models.MicroData();

            var q = from c in svc.Channels
                    where c.PartitionKey == channel
                    select c;

            if (q.FirstOrDefault() == null) throw new
            ArgumentException("Invalid channel");

            User u = (from auth in svc.Users
                     where auth.UserName == author
                     select auth).FirstOrDefault();

            if (u == null)
            //throw new ArgumentException("Invalid Author");
            {
                var user = new User();
                user.UserName = author;
                user.DateCreated = DateTime.UtcNow;
                user.PartitionKey = user.UserName;
                user.RowKey = string.Empty;
                svc.AddObject("Users", user);
                u = user;
            }

            var m = new Models.Message(channel, author, msg);
            svc.AddObject("Messages", m);

            svc.SaveChanges();

            return this.RedirectToAction("Index");
        }

实例就像我做查询数据服务,我化新 DataServiceContext 为入口点和指定的通道的查询以检查它存在,如果未找到引发异常。 我将创建新的邮件传递用户输入。 在创建邮件后我告诉上下文我我将添加到,"消息"的方式,并且新的邮件对象 m EntitySet 名称中有到被调用 svc.AddObject"Messages"m) 添加新对象 ; 传递。 最后,我想要通过调用 svc.SaveChanges() ; 推到表服务的所做的更改。

有几个您可能会注意到这里的差异。 第一个是架构的由于缺少一个固定 Azure 表中。 没有架构意味着我没有强类型化的数据,必须调用非类型化 AddObject() 对 DataServiceContext 实例并将新对象传递和实体设置我将添加到,而不是我对我的在场使用类型化的 AddTo…() 方法存储。 值得注意,更具通用性的 AddObject() 方法在场的方案中仍然可用 ; 但是,我的示例我使用强类型化的方法来利用编译时检查,依此类推。

第二个不同之处也有些属性化的固定,是概念的架构的在缺少一个一流的关系。 您第一次发现此区别我结构 Azure 表与我的在场的数据源中数据的方式中。 PostMessage 操作中您会注意到我正在不设置链接我的新对象 ; 而是,直接作为我实体属性存储任何关系信息中。

如果我已修改现有实例而不是创建一个新,我将第一次查询的希望更新,进行所需的更改的对象和,最后,而不是 AddObject,我将调用 UpdateObject 方法向上下文指明它需要就像我一样与在场的数据服务,发送下一次调用 SaveChanges(),对象的更新。 同样,通过调用 Delete 方法可以指示为上下文我要删除该对象中删除的实例,与还是否我正在访问一个 Azure 表服务或我自己的在场服务。

设置汇总

查看这些一起的两个示例,可以看到之间针对内部部署服务进行开发的方式简单移动并的 Azure 表服务使用同一个简单 ADO.NET 数据服务客户端库。 在所涉及的学习曲线是您应还负责管理每个数据源而不是平面的并主要包含在考虑关系存储模型并在多非结构化的 Azure 表模型以及 Azure 表 PartitionKey 和 RowKey 模型的感知之间的一个班次。 如果您重点主要针对这些服务的应用程序开发,则建立针对一项服务进行开发的技能是转让对任何其他数据服务的开发。

Elisa Flasko 是 Microsoft,包括 ADO.NET 技术、 XML 技术和 SQL Server 连接技术在数据可编程性小组程序经理。 用户可以访问在 blogs.msdn.com/elisaj.