2、WCF 结合 Self Tracking Entity 的 Demo
服务端:NTierServer/IMyService.cs
服务端: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);
}
}
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 的应用
* 1、通过 WCF 使用 Self Tracking Entity 不需手动调用 StartTracking()
* 2、先 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();
}
}
}
}
* 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;
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>
<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>
<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>
<!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();
}
}
}
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();
}
}
}
OK
[源码下载]
[源码下载]
本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/341388
,如需转载请自行联系原作者