《Entity Framework 6 Recipes》中文翻译——第九章EntityFramework在N层架构程序中的应用(七)
在WCF服务中的序列化代理
问题
您有一个从查询返回的动态代理对象,你想要把它像POCO对象已经进行序列化。在序列化基于实体对象的POCO(普通旧CLR对象)时,实体框架会自动生成一个动态生成的派生类型为每个POCO实体对象,称为动态代理对象。代理对象覆盖了许多的POCO类虚拟属性去注册钩子为展现功能,如更改跟踪和相关实体的延迟加载。
解决方案
假设你有如下一个模型

我们将使用代理数据契约解析器反序列化一个代理对象为POCO对象在WCF客户端。执行以下操作:
1、创建一个新的WCF服务应用程序。添加ADO.NET Entity Data Model,选择Client表
2、打开实体框架生成的客户端POCO类,并添加虚拟关键字为每个属性,这样做会导致实体框架生成动态代理类。
public class Client
{
public virtual int ClientId { get; set; }
public virtual string Name { get; set; }
public virtual string Email { get; set; }
}
我们需要的数据协定序列化程序使用代理数据契约解析类为WCF服务的客户端将客户端Client代理转换为Client实体。为此,我们将创建一个操作行为属性和应用属性到GetClient()服务方法。记住,代理数据契约解析类驻留在实体框架命名空间。
public class ApplyProxyDataContractResolverAttribute : Attribute, IOperationBehavior
{
public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters)
{ } public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
{
DataContractSerializerOperationBehavior dataContractSerializerOperationBehavior =
operationDescription.Behaviors.Find <DataContractSerializerOperationBehavior>();
dataContractSerializerOperationBehavior.DataContractResolver =
new ProxyDataContractResolver(); } public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
{
DataContractSerializerOperationBehavior dataContractSerializerOperationBehavior =
operationDescription.Behaviors.Find<DataContractSerializerOperationBehavior>();
dataContractSerializerOperationBehavior.DataContractResolver =
new ProxyDataContractResolver();
} public void Validate(OperationDescription operationDescription)
{
}
}
4、修改Iservice.cs的代码如下
[ServiceContract]
public interface IService1
{
[OperationContract]
void InsertTestRecord(); [OperationContract]
Client GetClient(); [OperationContract]
void Update(Client client);
}
5、实现Iservice中的接口在IService1.svc.cs 中
public class Service1 : IService1
{
[ApplyProxyDataContractResolverAttribute]
public Client GetClient()
{
using (var context = new EntitiesContext())
{
context.Configuration.LazyLoadingEnabled = false;
return context.Clients.Single();
} }
[ApplyProxyDataContractResolverAttribute]
public void InsertTestRecord()
{
using (var context = new EntitiesContext())
{
context.Database.ExecuteSqlCommand("delete from Client");
context.Database.ExecuteSqlCommand(@"insert into
Client(Name, Email)
values ('Jerry Jones','jjones@gmail.com')"); }
}
[ApplyProxyDataContractResolverAttribute]
public void Update(Client client)
{
using (var context = new EntitiesContext())
{
context.Entry(client).State =
EntityState.Modified;
context.SaveChanges();
}
}
}
6、在解决方案中添加一个新的控制台应用程序项目作为我们的客户端,同时添加WCF服务引用
class Program
{
static void Main(string[] args)
{
using (var serviceClient = new Service1Client())
{
serviceClient.InsertTestRecord();
var client = serviceClient.GetClient();
Console.WriteLine("Client is: {0} at {1}",
client.Name, client.Email);
client.Name = "Alex Park";
client.Email = "Alex P@hotmail.com";
serviceClient.Update(client);
client = serviceClient.GetClient();
Console.WriteLine("Client changed to: {0} at {1}",
client.Name, client.Email); }
}
}
结果:

微软建议使用WCF POCO对象简化实体对象的序列化。然而,如果你的应用程序是使用POCO对象改变的通知(你有虚拟和显著的性能导航属性集合的类型是ICollection),然后实体框架会创建查询返回的实体动态代理。
《Entity Framework 6 Recipes》中文翻译——第九章EntityFramework在N层架构程序中的应用(七)的更多相关文章
- 《Entity Framework 6 Recipes》翻译系列 (1) -----第一章 开始使用实体框架之历史和框架简述
微软的Entity Framework 受到越来越多人的关注和使用,Entity Framework7.0版本也即将发行.虽然已经开源,可遗憾的是,国内没有关于它的书籍,更不用说好书了,可能是因为EF ...
- 《Entity Framework 6 Recipes》翻译系列(2) -----第一章 开始使用实体框架之使用介绍
Visual Studio 我们在Windows平台上开发应用程序使用的工具主要是Visual Studio.这个集成开发环境已经演化了很多年,从一个简单的C++编辑器和编译器到一个高度集成.支持软件 ...
- 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型
第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...
- Entity Framework 6 Recipes 2nd Edition(9-3)译->找出Web API中发生了什么变化
9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Fri ...
- How to: Use Both Entity Framework and XPO in a Single Application 如何:在单个应用程序中同时使用实体框架和 XPO
This topic demonstrates how to create a simple XAF application that uses both the Entity Framework ( ...
- 《Entity Framework 6 Recipes》翻译系列 (4) -----第二章 实体数据建模基础之从已存在的数据库创建模型
不知道对EF感兴趣的并不多,还是我翻译有问题(如果是,恳请你指正),通过前几篇的反馈,阅读这个系列的人不多.不要这事到最后成了吃不讨好的事就麻烦了,废话就到这里,直奔主题. 2-2 从已存在的数据库创 ...
- 《Entity Framework 6 Recipes》翻译系列 (5) -----第二章 实体数据建模基础之有载荷和无载荷的多对多关系建模
2-3 无载荷(with NO Payload)的多对多关系建模 问题 在数据库中,存在通过一张链接表来关联两张表的情况.链接表仅包含连接两张表形成多对多关系的外键,你需要把这两张多对多关系的表导入到 ...
- Entity Framework 6 Recipes 2nd Edition(10-9)译 -> 在多对多关系中为插入和删除使用存储过程
10-9. 在多对多关系中为插入和删除使用存储过程 问题 想要在一个无载荷的多对多关系中使用存储过程(存储过程只影响关系的连接表) 解决方案 假设有一个多对多关系的作者( Author)表和书籍( B ...
- 《Entity Framework 6 Recipes》中文翻译系列 (37) ------ 第六章 继承与建模高级应用之独立关联与外键关联
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-13 在基类中应用条件 问题 你想从一个已存在的模型中的实体派生一个新的实体, ...
随机推荐
- 纯CSS制作冒泡提示框
来源:http://www.ido321.com/1214.html 前两天翻译了一篇文章,关于利用css的border属性制作基本图形:http://www.ido321.com/1200.html ...
- Matlab文件操作
1. Matlab文件操作主要有三个步骤:首先打开文件,然后对文件进行读写操作,最后要关闭文件. 2. fid=fopen(文件名,打开方式) 'r' 只读,文件必须存在(缺省的打开方式) 'w' ...
- .net组件技术
.NET是什么? •.NET是一个平台,而不是一种语言. •.NET是Microsoft的用以创建XML Web服务(下一代软件)平台,该平台将信息.设备和人以一种统一的.个性化的方式联系起来. ...
- Spring4整合Hibernate4详细示例
1. Spring整合Hibernate,主要是解决什么问题? a.让Spring提供的IOC容器来管理Hibernate的SessionFactory b.让Hibernate使用Spring提供的 ...
- 修改Map中确定key对应的value问题
今天在码代码的时候出现一个没有预料的问题: 先看下面的代码: public static void main(String[] args) { String[] files=new String[]{ ...
- delphi debug release区别是什么?
1. 基础知识介绍: Debug编译:是为了便于程序调试,所以目标代码里附加有许多额外的东西.Release编译:是产品可作为正式拷贝发布了,已经不需要那些仅为调试而编译进去东西. (在 Releas ...
- poj 1517 u Calculate e
u Calculate e Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 19465 Accepted: 11362 ...
- 如何设置(修改)jetty(maven插件maven-jetty-plugi)的端口
在使用jetty的maven插件,有两种方式来改变jetty server的端口,第一种方式较为简单,即: 通过命令行指定端口:mvn -Djetty.port=9999 jetty:run 另一种方 ...
- 在线的JSON formate工具
一个非常好的json formate工具 可以很容易发现json的错误,以及对json进行格式化 https://jsonformatter.curiousconcept.com/
- 在Hibernate中使用HibernateTemplate来进行包含sql语句的查询
/** * 使用sql语句进行查询操作 * @param sql * @return */ public List queryWithSql(final Stri ...