本文章是由機器翻譯。

資料服務

存取您的資料,[內部] 或 [在使用 ADO.NET 資料服務: 雲霧

Elisa Flasko

可從 MSDN 程式庫 的程式碼下載
瀏覽線上的程式碼

本文根據 Windows Azure 的 ASP.NET MVC 的搶鮮版設計的。

本文將告訴您:

  • Windows Azure
  • ASP.NET MVC
  • Windows Azure 的資料表
  • 前提與比較雲朵應用程式開發
本文將使用下列技術:
Windows Azure,ASP.NET MVC

內容

應用程式
取用一個 On-公司資料服務使用 ADO.NET 資料服務的用戶端程式庫
查詢資料
建立,更新,及刪除
取用的 Azure 資料表的資料服務
Azure 的資料表的資料模型
ADO.NET 資料服務用戶端程式庫
定義用戶端上的模型
建立資料表
查詢資料
建立,更新,及刪除
設定加總

Web 服務已 年現在,但是什麼的作用中主題,您可能會 wonder,最近是每個人都指這些資料服務嗎?已變更的 Web 架構應用程式而 matured (使用範例的完備網際網路應用程式 [RIA] 的流行),有已經過的未經處理的資料減任何介面的公開值的增加的感知或,要使用它格式化,任何服務或應用程式。資料服務是簡單資料中心服務以 RESTful 介面,執行完全的 — 應用程式中公開純的資料,供使用。這類服務會公開使用一個統一的介面由 Web 用戶端在公司內部網路或網際網路資料。資料服務會可以建置及裝載於您的公司使用 ADO.NET 資料上安全地一項服務公開資料服務伺服器程式庫,或可能可用的各種不同的裝載服務 (例如 Windows Azure 資料表。Windows Azure 會是 Microsoft 定域機組平台的基礎。它會在 「 作業系統的定域機組 」 提供基本的建置區塊,您需要撰寫可調整且高度可用的服務。Azure,Windows Azure 表,主要部分會允許使用者保存定域機組中的資料,並將公開的資料,它會儲存為資料服務。

無論,裝載資料服務 ADO.NET 資料 Services Framework,請提供針對一個範圍的 Microsoft 開發平台 (.NET,Silverlight、 ASP.NET AJAX,等等),可讓您輕鬆地使用這些服務,在您的應用程式中建立的用戶端程式庫的一組。

fig01.gif

[圖 1 Micro-根據資料服務所公開的實體資料模型

應用程式

整個這的篇文章中,我將會建置簡單的 Micro-根據應用程式,使用 ASP.NET 模型檢視控制器 (MVC) (Release Candidate),並將詳細說明一些建置這類 Services 為基礎的應用程式時所發生的一般案例。我將假設,之前瞭解 MVC,並將因此不討論這種模式的細節。如果您需要有關 ASP.NET MVC,請參閱ASP.NET MCV 網站. 比較的用途我會查看兩個版本相同的基本應用程式 — 一個以使用的公司的資料服務,一個使用的 Azure 的資料表的資料服務。兩個版本的程式碼包含在隨附的程式碼下載。

Micro-根據應用程式可讓使用者張貼郵件到特定的通道,建立新的通道,並在他們感興趣的通道中檢視郵件時。模型有已公開的資料服務的此應用程式組成的三種類型的項目: 郵件 」、 「 通道及 「 具有一對一的大部分的對應,可至資料庫使用者。值得注意的是這時候與公司的資料來源,這個模型不包含頂級概念的實體 (Entity) 之間的關係。郵件會由個別使用者張貼至特定的通道 (請參閱 [圖 1 )。

取用一個 On-公司資料服務使用 ADO.NET 資料服務的用戶端程式庫

讓我們先建立新的 ASP.NET MVC Web 應用程式,使用 Visual Studio 範本與 ASP.NET MVC 一起安裝。

有兩個主要的方法,您無法定義類別來代表用戶端上的模型的相關。您無法直接定義在模型。 定義在 POCO (純文字舊 CLR 物件) 的類別,在用戶端將用來代表 「 我在開發應用程式對 Windows Azure 表,或您無法在 Visual Studio 中使用新增服務參考精靈,以產生所需的類別時,我將會做的服務所公開的實體為當您用於 [Add service reference (新增服務參考 Windows Communication Foundation (WCF) 服務,只需專案上按一下滑鼠右鍵然後選擇 [新增服務參考。在 [新增服務參考] 對話方塊中,請輸入該的位址,服務進入點的 URI,然後再按一下 [確定]]。這會產生關聯的類別根據資料的服務定義中,並將它們加入至專案中。

[圖 2 所示,[新增服務參考精靈已經產生類別的每個我的實體: 通道、 訊息,使用者,以及類別代表整體服務 — microblogEntities。在類別 microblogEntities 會繼承自 DataServiceContext,並將用來做為起點來存取資料服務。

fig02.gif

[圖 2] 的 類別表示 Micro-根據模型

查詢資料

與應用程式目前設定來存取資料服務,我可以開始開發我的應用程式的其餘部分。在的首頁上應用程式會提供可用的頻道的清單,並允許使用者選取通道,以檢視今天的訊息。使用者也可以篩選內以 「 作者 」 為基礎的通道。若要以便在首頁我將會需要建立的 ActionResult,將會對應到索引檢視 (主控制器和索引檢視預設會建立在 MVC 範本中) 的主控制站中。在的首頁上我將需要從資料服務擷取所有可用的頻道的清單],[查詢篩選的今天的郵件之服務以及根據使用者輸入 (請參閱 [圖 3 )。

[圖 3] 網站的首頁

ADO.NET 資料服務用戶端程式庫讓您輕鬆地與使用 Language Integrated Query (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 首頁 (英文版) 檢視 (On-公司服務)

<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] (On-場所) 建立新訊息,並推入至資料存放區

[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") 屬性 (Attribute 裝飾。 我重新啟動執行個體化一個新 DataServiceContext 為 「 項目指向 [我的服務,然後我再查詢指定的通道,請檢查它是否存在。 如果通道 Does Not Exist 我會擲回例外狀況,; 否則我會建立新的郵件傳入使用者所輸入的資料]。 一旦建立郵件我需要告訴內容我就會有呼叫 svc.AddToMessages(m),所要加入新物件傳入新的訊息物件 m。 我也會設定表示附加至在這個案例的 svc.SetLink(m,"channel", chan) 這個新訊息的關聯性的連結 ; 關聯 svc.SetLink(m,"author", u) 與指定的通道的訊息 ; 關聯指定的 「 作者 」 的訊息。 我要推入變更服務以及推入至資料庫藉由呼叫 svc.SaveChanges() ; 最後。

如果我已修改現有的執行個體,而非建立新,我會先查詢我要更新,物件會進行所要的變更,和而不是不是 AddToMessages 中,,我會呼叫 UpdateObject 方法指出內容它需要傳送該物件的更新,下次我會呼叫 SaveChanges()。 同樣地,如果一旦我有物件,我已刪除的執行個體,我就會呼叫指示我要刪除的物件內容刪除方法。

在這個範例,並到目前為止在本文,您看過單一作業,單一的 HTTP 要求被傳送至服務用戶端以地圖上。 在許多情況下,也是有幫助,讓用戶端能夠批次處理一組作業,並傳送到單一的 HTTP 要求中的服務。 這會減少到服務來回往返,並讓的不可部分完成性的作業集的邏輯範圍。 ADO.NET 資料服務的用戶端程式庫支援,傳送到單一的 HTTP 要求透過呼叫 SaveChanges() 方法,傳遞 SaveChangesOptions.batch 做為唯一參數中服務的一組插入、 更新,和 / 或刪除作業。 這個參數的值會指示用戶端批次到單一的 HTTP 要求傳送至服務的所有暫止變更。 藉由傳送的變更,以一個批次,您確保可能會順利完成的所有變更,或沒有任何變更將會套用。

取用的 Azure 資料表的資料服務

開發.NET 應用程式使用 Windows Azure 資料表時是會使用 ADO.NET 資料服務的用戶端程式庫來存取資料。 在本節中,我將會逐步上面,使用相同的簡單應用程式的開發但這次我將會存取管理儲存在 Azure 的資料表的資料。 為這篇文章的其餘部分,我會假設 Windows Azure 儲存帳號設定已經設定,並可供您使用。 如需 Windows Azure 資料表使用者入門的更多資訊,請參閱 azure 服務平台開發人員中心.

Azure 的資料表的資料模型

之前開始的應用程式中,,有幾件事您必須知道 Azure 的資料表資料模型,為獲得最佳效能。 應用程式可能會選擇建立許多的資料表內 ; 其中的每個資料表則含有一組實體 (列),而每個項目會包含屬性 (資料行) 的一組使用儲存的帳戶。 每個實體] 是可以有最多 255 個屬性中,儲存為 < Name,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 Storage 服務、 佇列服務和存放裝置 」 服務的資料表)。 我會使用程式庫可以協助我存取資料表存放服務。 可以從 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 ] 所示,您可以看到我已定義一個 PartitionKey 和一個的 RowKey 所需的 Azure 資料表。 這是離開,以從哪些您所見的公司服務中因為它們是特定的 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");
        }
    }

建立資料表

一旦定義我的實體類別,我可以開始實際開發應用程式。 但首先,我需要在此看到,請將 [我的 Azure (資料表) 帳戶 (存取) 資訊加入 web.config 中:

<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 中沒有資料表控制,您可能會略過完全建立資料表的步驟,並直接進行程式,您現有的資料表設計。

檢查,並在我的應用程式中建立資料表中,我會使用 StorageClient 程式庫中的一部分,TableStorage.CreateTablesFromModel() 方法如這裡見:

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

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

查詢資料

設定以存取我的帳號 Azure 的資料表中的 [我的應用程式,使用它的其餘部分會運作只是,如果我所存取的公司的服務。 就像我的公司服務中,因為我使用 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,來檢查它存在,如果它找不到擲回例外狀況。 我會建立新的訊息,傳入使用者輸入。 一旦建立郵件我告訴內容我有呼叫 svc.AddObject 郵件 」 (M) 所要加入一個新物件,傳遞我正在新增到 「 訊息 」] 和 [新的訊息物件,m,EntitySet 名稱中。 我要發送變更至資料表的服務,藉由呼叫 svc.SaveChanges() ; 最後。

有差異,您可能會發現以下的幾個。 第一個是因為缺少固定的結構描述的 Azure 的資料表中。 這個缺乏結構描述會表示我會在沒有強型別 (Strongly Typed) 資料,而且必須呼叫不具型別的 AddObject() 執行 DataServiceContext 個體上,傳遞新的物件並實體設定我正在加入至,而不是我對我的公司所使用的型別的 AddTo…() 方法儲存。 值得注意這裡更泛用 AddObject() 方法仍可使用在公司的案例中,但是,在我的範例中我使用強型別的方法來利用的編譯時期檢查等。

在第二個,也有些屬性化固定的結構描述的缺少,處在缺少的頂級的關聯性的概念。 您首先注意到這個差異我結構 Azure 相較於我的公司資料來源的資料表中的資料的方式中。 PostMessage 動作中您會注意到我不是我的新物件上設定連結,,而的任何關聯性資訊儲存為我的項目中屬性的直接]。

如果我已修改現有的執行個體,而非建立新,我會先查詢之物件的更新,進行所要的變更所希望和,最後,而不是 AddObject,我就會呼叫內容指出它需要像我一樣的結果資料服務傳送更新該物件的下一次,我呼叫 SaveChanges(),UpdateObject 方法。 同樣地,刪除的執行個體,藉由呼叫刪除方法,用來指示我要刪除的物件內容,是也相同是否我正在存取的 Azure 表服務 」 或 「 我自己的公司的服務。

設定加總

查看這些一起的兩個範例,您就可以看到之間對的前提上的服務進行開發的簡單移動,並且用戶相同簡單 ADO.NET 資料服務端程式庫的使用所做的 Azure 的資料表 」 服務。 學習有關是如果您也負責管理每個資料來源,而一般,它大部分所組成的思考移位,關聯式存放裝置模型多非結構化 Azure 的資料表模型,以及 [Azure 資料表 PartitionKey] 及 [RowKey 模型的認知之間。 如果您的重點主要是針對這些服務的應用程式開發,您建立針對一項服務的開發的技術都將會傳送對任何其他的資料服務的開發。

Elisa Flasko 將是您,Microsoft,包括 ADO.NET 技術、 XML 的技術和 SQL Server 連線的技術資料的程式設計小組程式經理。 她可以在達到 blogs.msdn.com/elisaj.