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 ...
随机推荐
- DEDE站点从网站根目录移到子目录
修改DedeCms系统配置参数-站点设置 a.站点根网址修改为:http://域名/子目录 b.网页主页链接:/子目录 修改DedeCms系统配置参数-核心设置 a.安装目录:/子目录 批量修改原数据 ...
- Js屏蔽键盘事件
<script> function KeyDown(){ //屏蔽鼠标右键.Ctrl+n.shift+F10.F5刷新.退格键 //alert(& ...
- 01:Hello, World!
描述 对于大部分编程语言来说,编写一个能够输出“Hello, World!”的程序往往是最基本.最简单的.因此,这个程序常常作为一个初学者接触一门新的编程语言所写的第一个程序,也经常用来测试开发.编译 ...
- The Managed Metadata Service or Connection is currently not available
Does the following error message looks familiar to you? when you go to site Actions -> Site Sett ...
- codevs 1153 道路游戏
传送门 题目描述 Description 小新正在玩一个简单的电脑游戏.游戏中有一条环形马路,马路上有n 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针 ...
- 构建高可用web站点学习--前言
前言:本人对于提高web站点的访问量等的有很浓厚的兴趣,也学习了将近一年的时间,希望能总结点东西,虽然很多东西都是从书籍和资料中学习的,而不是原创,但是这是我总结的一点感悟和进行的分类吧.而且可能思路 ...
- 转:Top 10 Algorithms for Coding Interview
The following are top 10 algorithms related concepts in coding interview. I will try to illustrate t ...
- pojShredding Company
http://poj.org/problem?id=1416 #include<cstdio> #include<cstring> #define MAXN 100 using ...
- Linux下Apache PHP MYSQL 默认安装路径
apache: 如果采用RPM包安装,安装路径应在 /etc/httpd目录下apache配置文件:/etc/httpd/conf/httpd.confApache模块路径:/usr/sbin/apa ...
- COJ 0990 WZJ的数据结构(负十)
WZJ的数据结构(负十) 难度级别:D: 运行时间限制:5000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 给你一个N个节点的有根树,从1到N编号,根节点为1并给 ...