上接精進不休 .NET 4.0 (8) - ADO.NET Entity Framework 4.0 Self Tracking Entity

二、WCF 結合 Self Tracking Entity 的 Demo
服務端:NTierServer/IMyService.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace NTierServer
{
        [ServiceContract]
         public interface IMyService
        {
                [OperationContract]
                List<ProductCategory> GetCategories();

                [OperationContract]
                ProductCategory GetCategory(int categoryId);

                [OperationContract]
                int UpdateCategory(ProductCategory category);

                [OperationContract]
                int AddCategory(ProductCategory category);

                [OperationContract]
                int DeleteCategory(int categoryId);
        }
}
 
服務端:NTierServer/MyService.cs
/*
* ADO.NET Entity Framework 4.0 - WCF 結合 Self Tracking Entity 的應用
*         一、經過 WCF 使用 Self Tracking Entity 不需手動調用 StartTracking()
*         二、先 MarkAsAdded(), MarkAsModified(), MarkAsDeleted() 再 ApplyChanges() ; 或者 先 ApplyChanges() 再 ChangeObjectState(), ChangeRelationshipState()
*    
* 本 Demo 演示如何經過 WCF 結合 Self Tracking Entity 來實現對單表的增刪改查
*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.Data;

namespace NTierServer
{
         public class MyService : IMyService
        {
                // 取所有產品類別的實體集合
List<ProductCategory> GetCategories() List<ProductCategory> GetCategories()
                {
                        using (var ctx = new AdventureWorksEntities())
                        {
                                var result = ctx.ProductCategories.ToList();
                                return result;
                        }
                }

                // 根據 id 取產品類別實體
ProductCategory GetCategory() ProductCategory GetCategory(int categoryId)
                {
                        using (var ctx = new AdventureWorksEntities())
                        {
                                var result = ctx.ProductCategories.Single(c => c.ProductCategoryID == categoryId);
                                return result;
                        }
                }

                // 根據產品類別實體更新數據庫中的相關數據
int UpdateCategory() int UpdateCategory(ProductCategory category)
                {
                        using (var ctx = new AdventureWorksEntities())
                        {
                                // 先 ApplyChanges() 再 ChangeObjectState(), ChangeRelationshipState()
                                ctx.ProductCategories.ApplyChanges(category);
                                ctx.ObjectStateManager.ChangeObjectState(category, EntityState.Modified);

                                return ctx.SaveChanges();
                        }
                }

                // 根據產品類別實體向數據庫添加新的數據
int AddCategory() int AddCategory(ProductCategory category)
                {
                        using (var ctx = new AdventureWorksEntities())
                        {
                                ctx.ProductCategories.ApplyChanges(category);
                                return ctx.SaveChanges();
                        }
                }

                // 根據 id 刪除數據庫中的相關數據
int DeleteCategory() int DeleteCategory(int categoryId)
                {
                        using (var ctx = new AdventureWorksEntities())
                        {
                                var category = GetCategory(categoryId);

                                // 先 MarkAsAdded(), MarkAsModified(), MarkAsDeleted() 再 ApplyChanges()
                                category.MarkAsDeleted();
                                ctx.ProductCategories.ApplyChanges(category);

                                return ctx.SaveChanges();
                        }
                }
        }
}
 
服務端:NTierServer/Web.config
<system.serviceModel>
        <behaviors>
                <serviceBehaviors>
                        <behavior name="">
                                <serviceMetadata httpGetEnabled= "true" />
                                <serviceDebug includeExceptionDetailInFaults= "true" />
                        </behavior>
                </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment multipleSiteBindingsEnabled= "true" />
</system.serviceModel>
 
客戶端:NTierClient/Web.config
<system.serviceModel>
        <bindings>
                <basicHttpBinding>
                        <binding name= "BasicHttpBinding_IMyService" closeTimeout= "00:01:00"
                                openTimeout= "00:01:00" receiveTimeout= "00:10:00" sendTimeout= "00:01:00"
                                allowCookies= "false" bypassProxyOnLocal= "false" hostNameComparisonMode= "StrongWildcard"
                                maxBufferSize= "65536" maxBufferPoolSize= "524288" maxReceivedMessageSize= "65536"
                                messageEncoding= "Text" textEncoding= "utf-8" transferMode= "Buffered"
                                useDefaultWebProxy= "true">
                                <readerQuotas maxDepth= "32" maxStringContentLength= "8192" maxArrayLength= "16384"
                                        maxBytesPerRead= "4096" maxNameTableCharCount= "16384" />
                                <security mode= "None">
                                        <transport clientCredentialType= "None" proxyCredentialType= "None"
                                                realm="" />
                                        <message clientCredentialType= "UserName" algorithmSuite= "Default" />
                                </security>
                        </binding>
                </basicHttpBinding>
        </bindings>
        <client>
                <endpoint address= "http://localhost:10394/MyService.svc" binding= "basicHttpBinding"
                        bindingConfiguration= "BasicHttpBinding_IMyService" contract= "MyServiceReference.IMyService"
                        name= "BasicHttpBinding_IMyService" />
        </client>
</system.serviceModel>
 
客戶端:NTierClient/Demo.aspx
<%@ Page Language= "C#" AutoEventWireup= "true" CodeBehind= "Demo.aspx.cs" Inherits= "NTierClient.Demo" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns= "http://www.w3.org/1999/xhtml">
<head runat= "server">
        <title></title>
</head>
<body>
        <form id= "form1" runat= "server">
        <div>
                <asp:ListView ID= "ListView1" runat= "server" DataKeyNames= "ProductCategoryID" InsertItemPosition= "LastItem"
                        OnItemDeleting= "ListView1_ItemDeleting" OnItemInserting= "ListView1_ItemInserting"
                        OnItemUpdating= "ListView1_ItemUpdating" OnItemCanceling= "ListView1_ItemCanceling"
                        OnItemEditing= "ListView1_ItemEditing">
                        <EditItemTemplate>
                                <tr style="">
                                        <td>
                                                <asp:Button ID= "UpdateButton" runat= "server" CommandName= "Update" Text= "Update" />
                                                <asp:Button ID= "CancelButton" runat= "server" CommandName= "Cancel" Text= "Cancel" />
                                        </td>
                                        <td>
                                                 
                                        </td>
                                        <td>
                                                 
                                        </td>
                                        <td>
                                                <asp:TextBox ID= "NameTextBox" runat= "server" Text= '<%# Bind("Name") %>' />
                                        </td>
                                        <td>
                                                 
                                        </td>
                                        <td>
                                                 
                                        </td>
                                </tr>
                        </EditItemTemplate>
                        <InsertItemTemplate>
                                <tr style="">
                                        <td>
                                                <asp:Button ID= "InsertButton" runat= "server" CommandName= "Insert" Text= "Insert" />
                                                <asp:Button ID= "CancelButton" runat= "server" CommandName= "Cancel" Text= "Clear" />
                                        </td>
                                        <td>
                                                 
                                        </td>
                                        <td>
                                                 
                                        </td>
                                        <td>
                                                <asp:TextBox ID= "NameTextBox" runat= "server" Text= '<%# Bind("Name") %>' />
                                        </td>
                                        <td>
                                                 
                                        </td>
                                        <td>
                                                 
                                        </td>
                                </tr>
                        </InsertItemTemplate>
                        <ItemTemplate>
                                <tr style="">
                                        <td>
                                                <asp:Button ID= "DeleteButton" runat= "server" CommandName= "Delete" Text= "Delete" />
                                                <asp:Button ID= "EditButton" runat= "server" CommandName= "Edit" Text= "Edit" />
                                        </td>
                                        <td>
                                                <asp:Label ID= "ProductCategoryIDLabel" runat= "server" Text= '<%# Eval("ProductCategoryID") %>' />
                                        </td>
                                        <td>
                                                <asp:Label ID= "ParentProductCategoryIDLabel" runat= "server" Text= '<%# Eval("ParentProductCategoryID") %>' />
                                        </td>
                                        <td>
                                                <asp:Label ID= "NameLabel" runat= "server" Text= '<%# Eval("Name") %>' />
                                        </td>
                                        <td>
                                                <asp:Label ID= "rowguidLabel" runat= "server" Text= '<%# Eval("rowguid") %>' />
                                        </td>
                                        <td>
                                                <asp:Label ID= "ModifiedDateLabel" runat= "server" Text= '<%# Eval("ModifiedDate") %>' />
                                        </td>
                                </tr>
                        </ItemTemplate>
                        <LayoutTemplate>
                                <table id= "itemPlaceholderContainer" runat= "server" border= "0" style="">
                                        <tr runat= "server" style="">
                                                <th runat= "server">
                                                </th>
                                                <th runat= "server">
                                                        ProductCategoryID
                                                </th>
                                                <th runat= "server">
                                                        ParentProductCategoryID
                                                </th>
                                                <th runat= "server">
                                                        Name
                                                </th>
                                                <th runat= "server">
                                                        rowguid
                                                </th>
                                                <th runat= "server">
                                                        ModifiedDate
                                                </th>
                                        </tr>
                                        <tr id= "itemPlaceholder" runat= "server">
                                        </tr>
                                </table>
                        </LayoutTemplate>
                </asp:ListView>
        </div>
        </form>
</body>
</html>
 
客戶端:NTierClient/Demo.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.ServiceModel;

namespace NTierClient
{
         public partial class Demo : System.Web.UI.Page
        {
void Page_Load() void Page_Load(object sender, EventArgs e)
                {
                         if (!Page.IsPostBack)
                        {
                                BindData();
                        }
                }

void BindData() void BindData()
                {
                        var svc = new ChannelFactory<MyServiceReference.IMyService>( "BasicHttpBinding_IMyService").CreateChannel();

                        var categories = svc.GetCategories();
                        ListView1.DataSource = categories;
                        ListView1.DataBind();
                }

void ListView1_ItemUpdating() void ListView1_ItemUpdating(object sender, ListViewUpdateEventArgs e)
                {
                        var svc = new MyServiceReference.MyServiceClient();
                        var category = svc.GetCategory((int)ListView1.DataKeys[e.ItemIndex].Value);

                        category.Name = ( string)e.NewValues[ "Name"];

                        svc.UpdateCategory(category);

                        ListView1.EditIndex = -1;
                        BindData();
                }

void ListView1_ItemInserting() void ListView1_ItemInserting(object sender, ListViewInsertEventArgs e)
                {
                        var category = new MyServiceReference.ProductCategory();
                        category.Name = ( string)e.Values[ "Name"];
                        category.rowguid = Guid.NewGuid();
                        category.ModifiedDate = DateTime.Now;

                        var svc = new MyServiceReference.MyServiceClient();
                        svc.AddCategory(category);

                        BindData();
                }

void ListView1_ItemDeleting() void ListView1_ItemDeleting(object sender, ListViewDeleteEventArgs e)
                {
                        var svc = new MyServiceReference.MyServiceClient();
                        svc.DeleteCategory((int)ListView1.DataKeys[e.ItemIndex].Value);

                        BindData();
                }

void ListView1_ItemCanceling() void ListView1_ItemCanceling(object sender, ListViewCancelEventArgs e)
                {
                        ListView1.EditIndex = -1;
                        BindData();
                }

void ListView1_ItemEditing() void ListView1_ItemEditing(object sender, ListViewEditEventArgs e)
                {
                        ListView1.EditIndex = e.NewEditIndex;
                        BindData();
                }
        }
}
 
 
相關文章
相關標籤/搜索