Wcf+EF框架搭建实例
一.最近在使用Wcf创建数据服务,但是在和EF框架搭建数据访问时遇到了许多问题
下面是目前整理的基本框架代码,经供参考使用,源代码地址:http://git.oschina.net/tiama3798/Wcf_EFDemo
说明:框架搭建中使用EF访问数据库,简单工厂模式组织代码
WCFThree.Entity:简单工厂模式的实体层、EF的实体模板、WCF的数据契约
WCFThree.Abstract:简单工厂模式的抽象接口层、WCF服务操作契约
WCFThree.Factory:简单工厂模式的实现层、WCF服务器契约实现
WCFThree.Proxy:WCF的客户端代理封装
WCFThree.Service:WCF的服务端定义
WCFThree.Test:测试程序

部分代码说明:
1.为了使客户端和服务端使用相同的代理类,EF框架中禁用动态代理类实例,同时延迟加载也失效
public BaseContext()
: base("name=BaseContext")
{
//在Wcf中禁用EF的代理类和延迟加载
this.Configuration.ProxyCreationEnabled = false;
}
2.为了解决序列化的循环引用问题,显示指定数据契约以及对应的属性,这样还有一个好处就是从服务端向客户端数据输出可以带着关联表数据(因为没法延迟加载,所以在服务器端需要再查询一次关联表数据)
[Table("student")]
[DataContract(IsReference = true)]
public partial class student
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public student()
{
scores = new HashSet<score>();
}
[Key]
[StringLength()]
[DataMember]
public string sno { get; set; }
[Required]
[StringLength()]
[DataMember]
public string sname { get; set; }
[StringLength()]
[DataMember]
public string ssex { get; set; }
public DateTime? sbirthday { get; set; }
[Column("class")]
[StringLength()]
[DataMember]
public string _class { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
[DataMember]
public virtual ICollection<score> scores { get; set; }
}
3.客户端代理使用BasicHttpBinding创建
public class RemoteServiceFactory
{
private string GetUrl(string Operate)
{
return string.Format("http://localhost:8733/Design_Time_Addresses/WCFThree.Service/{0}/", Operate);
}
/// <summary>
/// 获取学生操作
/// </summary>
/// <returns></returns>
public IStudent GetStudent()
{
string url = GetUrl("Student");
return CreateService<IStudent>(url);
}
public IScore GetScore()
{
return CreateService<IScore>(GetUrl("Score"));
}
public IUserInfo GetUserInfo()
{
return CreateService<IUserInfo>(GetUrl("UserInfo"));
}
private T CreateService<T>(string url)
{
var binding = new BasicHttpBinding();
binding.MaxReceivedMessageSize = maxReceivedMessageSize;
binding.ReaderQuotas = new System.Xml.XmlDictionaryReaderQuotas();
binding.ReaderQuotas.MaxStringContentLength = maxReceivedMessageSize;
binding.ReaderQuotas.MaxArrayLength = maxReceivedMessageSize;
binding.ReaderQuotas.MaxBytesPerRead = maxReceivedMessageSize; ChannelFactory<T> chan = new ChannelFactory<T>(binding, new EndpointAddress(url));
//异常处理注册
//cha.Endpoint.EndpointBehaviors.Add();
foreach (var op in chan.Endpoint.Contract.Operations)
{
var dataContractBehavior = op.Behaviors.Find<DataContractSerializerOperationBehavior>() as DataContractSerializerOperationBehavior;
// 获取或设置对象图中要序列化或反序列化的最大项数。
if (dataContractBehavior != null)
dataContractBehavior.MaxItemsInObjectGraph = int.MaxValue;
}
chan.Open();
return chan.CreateChannel();
}
private const int maxReceivedMessageSize = ;
}
4.测试及结果说明
RemoteServiceFactory _remote = new RemoteServiceFactory();
IStudent _IStudent = _remote.GetStudent(); ////1.添加学生
WCFThree.Entity.student stu1 = new Entity.student()
{
sno = "",
sname = "李四",
ssex = "男",
sbirthday = DateTime.Now,
_class = ""
};
_IStudent.Add(stu1); ////2.获取列表
List<WCFThree.Entity.student> stuList = _IStudent.GetList();
foreach (var item in stuList)
{
//编号-姓名---学习的课程数量(获取关联表数据失效)
Console.WriteLine(string.Format("{0}-{1}--{2}", item.sno, item.sname, item.scores.Count));
} //3.获取指定对象及关联数据----方式1:独立请求
WCFThree.Entity.student stu2 = _IStudent.GetModel("");
Console.WriteLine(stu2.sname);
IScore _IScore = _remote.GetScore();
List<WCFThree.Entity.score> scoreList = _IScore.GetList_Stu(stu2.sno);
foreach (var item in scoreList)
{
Console.WriteLine(string.Format("{0}-{1}", item.sno, item.degree));
} //获取关联表数据方式2
WCFThree.Entity.student stu3 = _IStudent.GetModel_Related("");
Console.WriteLine(stu3.sname);
Console.WriteLine(stu3.scores.Count);
Console.WriteLine(stu3.scores.First().degree);
二.其他参考实例:
http://www.cnblogs.com/guozili/archive/2012/09/03/2667429.html
Wcf+EF框架搭建实例的更多相关文章
- EF框架搭建小总结--CodeFirst模型优先
前言:之前在下总结编写了一篇 EF框架搭建小总结--ModelFirst模型优先 博文,看到一段时间内该博文的访问量蹭.蹭蹭.蹭蹭蹭...往上涨(实际也不是很多,嘿嘿),但是还是按捺不住内心的喜悦(蛮 ...
- EF框架搭建小总结--CodeFirst代码优先
前言:之前在下总结编写了一篇 EF框架搭建小总结--ModelFirst模型优先 博文,看到一段时间内该博文的访问量蹭.蹭蹭.蹭蹭蹭...往上涨(实际也不是很多,嘿嘿),但是还是按捺不住内心的喜悦(蛮 ...
- Hibernate框架搭建实例
一,Hibernate是一个持久层,是一个专门负责管理数据库连接的框架: 二,Hibernate的搭建实例: 1.在Hibernate的官方网站(http://www.hibernate.org)可以 ...
- EF框架搭建
EF框架搭配lambda表达式使用起来非常高效便捷,有两种方法使用EF框架: 一是.添加“ADO.NET Entity Data Model”项,绑定配置数据库链接,勾选表和存储过程等,自动生成实体: ...
- EF框架搭建小总结--ModelFirst模型优先
前言:去年刚工作的时候,也是刚刚正式接触.net,当时了解了EF以及三种开发模式,Database First.Model First .Code First.公司用的开发模式是Database Fi ...
- Spring+Spring MVC+Hibernate框架搭建实例
前言:这里只是说明整个搭建流程,并不进行原理性的讲解 一 下面所需要用到的数据库配置: 数据库方面,使用mysql创建一个users表,具体代码如下: 1 2 3 4 5 6 7 8 9 10 11 ...
- Mybatis 框架搭建实例
前言 MyBatis是一个优秀的持久层框架.原生的jdbc操作存在大量的重复性代码(如注册驱动,创建连接,创建statement,结果集检测等).框架的作用就是把这些繁琐的代码封装. MyBatis通 ...
- ssh框架搭建实例代码教程步骤
http://blog.csdn.net/u010539352/article/details/49255729
- SSH框架总结(框架分析+环境搭建+实例源码下载) 《转》
这篇文章比较易懂,易理解: 首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层W ...
随机推荐
- [ JS 进阶 ] 如何改进代码性能 (3)
原文链接 总结一下 1.减少操作dom的次数 2.需要多次使用某全局变量的时候,将其赋给一个局部变量,避免重复查找 3.优化循环 4.多用逗号和直接赋值的方式来var,减少工厂方式和构造函数方式创建对 ...
- JQUERY1.9学习笔记 之内容过滤器(二) 空元素选择器
描述:选择没有子元素(包括文本节点)的标签. jQuery(":empty") 与:parent相反. 例:找出所有为空的元素.(他们没有子元素或文本元素). <!docty ...
- 【行为型】Memento模式
备忘录模式顾名思义就是一种能有备忘作用的设计模式,其目的是在对象外部保存其在某一时刻的状态信息,并且在任何需要的时候,都可以通过备忘录中保存的状态数据恢复对象在当时情形下的状态. 备忘录模式旨在对象的 ...
- 常用命令(ubuntu)
1.打开终端的方法 Ubuntu 中按左侧栏的第一个“面板主页(Dash 主页)”(可以按win键调出),在里面输入terminal可以打开终端,另外打开终端的快捷键是Ctrl+Alt+T 2.修改用 ...
- JavaScript语言内置对象
String(字符串对象)RegExp(正则表达式对象)Number(数字对象)Math(数学对象)Function(函数对象)Error(异常对象)Date(日期/时间对象)Boolean(布尔对象 ...
- codevs 1107 等价表达式
传送门 题解:第一眼这题好像非常难得样子,简直没有思路.但是这可以用栈带入特殊值来解决.这里用到两个栈,一个是存贮数字,另一个存贮运算符,按优先级进行运算.当读入的运算符比运算符栈的栈顶元素优先级低时 ...
- 7.5 Point-in-Time (Incremental) Recovery Using the Binary Log 使用binay log 基于时间点恢复
7.5 Point-in-Time (Incremental) Recovery Using the Binary Log 使用binay log 基于时间点恢复 7.5.1 Point-in-Tim ...
- jsoup web scraping
jsoup简介 jsoup是一款HTML解析器,可用与解析URL地址.HTML文本内同等,操作类似于jQuery,可通过DOM查找数据,操作数据, 使用时需引入jsoup jar jsoup可以从包含 ...
- 解读sample2
说明 理解被测试代码 理解测试代码 组织关系 检查字符串比较结果的断言 说明 被测试代码文件 sample2.h.sample2.cc 测试代码文件 sample2_unittest.cc 官网上如是 ...
- linux chgrp命令【转载】
在lunix系统里,文件或目录的权限的掌控以拥有者及所诉群组来管理.可以使用chgrp指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别码都可以.Chgrp命令就是change group的 ...