天天看点

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

2、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(); 

                ProductCategory GetCategory(int categoryId); 

                int UpdateCategory(ProductCategory category); 

                int AddCategory(ProductCategory category); 

                int DeleteCategory(int categoryId); 

        } 

}

服务端:NTierServer/MyService.cs

/* 

* ADO.NET Entity Framework 4.0 - WCF 结合 Self Tracking Entity 的应用 

*         1、通过 WCF 使用 Self Tracking Entity 不需手动调用 StartTracking() 

*         2、先 MarkAsAdded(), MarkAsModified(), MarkAsDeleted() 再 ApplyChanges() ; 或者 先 ApplyChanges() 再 ChangeObjectState(), ChangeRelationshipState() 

*    

* 本 Demo 演示如何通过 WCF 结合 Self Tracking Entity 来实现对单表的增删改查 

*/ 

using System.Data; 

        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) 

                                var result = ctx.ProductCategories.Single(c => c.ProductCategoryID == categoryId); 

                // 根据产品类别实体更新数据库中的相关数据 

int UpdateCategory() int UpdateCategory(ProductCategory category) 

                                // 先 ApplyChanges() 再 ChangeObjectState(), ChangeRelationshipState() 

                                ctx.ProductCategories.ApplyChanges(category); 

                                ctx.ObjectStateManager.ChangeObjectState(category, EntityState.Modified); 

                                return ctx.SaveChanges(); 

                // 根据产品类别实体向数据库添加新的数据 

int AddCategory() int AddCategory(ProductCategory category) 

                // 根据 id 删除数据库中的相关数据 

int DeleteCategory() int DeleteCategory(int categoryId) 

                                var category = GetCategory(categoryId); 

                                // 先 MarkAsAdded(), MarkAsModified(), MarkAsDeleted() 再 ApplyChanges() 

                                category.MarkAsDeleted(); 

服务端: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

        <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> 

客户端: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> 

                                                <asp:TextBox ID="NameTextBox" runat="server" Text='<%# Bind("Name") %>' /> 

                                </tr> 

                        </EditItemTemplate> 

                        <InsertItemTemplate> 

                                                <asp:Button ID="InsertButton" runat="server" CommandName="Insert" Text="Insert" /> 

                                                <asp:Button ID="CancelButton" runat="server" CommandName="Cancel" Text="Clear" /> 

                        </InsertItemTemplate> 

                        <ItemTemplate> 

                                                <asp:Button ID="DeleteButton" runat="server" CommandName="Delete" Text="Delete" /> 

                                                <asp:Button ID="EditButton" runat="server" CommandName="Edit" Text="Edit" /> 

                                                <asp:Label ID="ProductCategoryIDLabel" runat="server" Text='<%# Eval("ProductCategoryID") %>' /> 

                                                <asp:Label ID="ParentProductCategoryIDLabel" runat="server" Text='<%# Eval("ParentProductCategoryID") %>' /> 

                                                <asp:Label ID="NameLabel" runat="server" Text='<%# Eval("Name") %>' /> 

                                                <asp:Label ID="rowguidLabel" runat="server" Text='<%# Eval("rowguid") %>' /> 

                                                <asp:Label ID="ModifiedDateLabel" runat="server" Text='<%# Eval("ModifiedDate") %>' /> 

                        </ItemTemplate> 

                        <LayoutTemplate> 

                                <table id="itemPlaceholderContainer" runat="server" border="0" style=""> 

                                        <tr runat="server" style=""> 

                                                <th runat="server"> 

                                                </th> 

                                                        ProductCategoryID 

                                                        ParentProductCategoryID 

                                                        Name 

                                                        rowguid 

                                                        ModifiedDate 

                                        </tr> 

                                        <tr id="itemPlaceholder" runat="server"> 

                                </table> 

                        </LayoutTemplate> 

                </asp:ListView> 

        </div> 

        </form> 

</body> 

</html>

客户端:NTierClient/Demo.aspx.cs

using System.Web; 

using System.Web.UI; 

using System.Web.UI.WebControls; 

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; 

                        svc.AddCategory(category); 

void ListView1_ItemDeleting() void ListView1_ItemDeleting(object sender, ListViewDeleteEventArgs e) 

                        svc.DeleteCategory((int)ListView1.DataKeys[e.ItemIndex].Value); 

void ListView1_ItemCanceling() void ListView1_ItemCanceling(object sender, ListViewCancelEventArgs e) 

void ListView1_ItemEditing() void ListView1_ItemEditing(object sender, ListViewEditEventArgs e) 

                        ListView1.EditIndex = e.NewEditIndex; 

OK 

<a href="http://cid-ebc0a6c186317ea6.office.live.com/self.aspx/Share/VS2010.rar" target="_blank">[源码下载]</a>

     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/341388,如需转载请自行联系原作者