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 ...
随机推荐
- 如何用angularjs制作一个完整的表格之四__自定义ng-model标签的属性使其支持input之外的html元素
有的时候我们需要为非input类型的元素添加ng-model来实现双向的数据绑定,从而减少冗余代码,那么可以尝试一下的方式 例如:我页面中使用了contenteditable这个属性来实现用户可直接编 ...
- flvplayer.swf flv视频播放器使用方法
今天由于网页上要加入一个视频文件,就研究了一下flv视频播放器flvplayer.swf : 关于SewisePlayer 插件 演示例子链接 一.直接在html文件中加载: &l ...
- js JSONP实例
<script type="text/javascript"> $(function(){ checkuserstatus(); $('#loginbutton').c ...
- Java基础学习第一天
================每日必读==================== 写代码: 1.明确需求.我需要实现什么需求? 2.分析思路.我需要怎么实现需求? 3.确定步骤.我的每一部分思路需要使 ...
- memcpy函数的使用方法
c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. 1.函数原型 void *memcpy(void * ...
- xilinx FPGA普通IO作PLL时钟输入
本帖转自于 :http://www.cnblogs.com/jamesnt/p/3535073.html 在xilinx ZC7020的片子上做的实验; [结论] 普通IO不能直接作PLL的时钟输入, ...
- 关于cmd的东西
为了督促自己,就从简单的开始学起,希望用博客来纪念我的成长 1)输入 CMD 回车.进入DOS提示符状态下.输入cd\ 回车 表示进入 c:\> 也到了C盘根目录下 2)d: 回车 是进入D盘当 ...
- MVC form post 传值
http://www.cnblogs.com/firstcsharp/archive/2013/08/05/3238321.html @using (Html.BeginForm())参数示例 MVC ...
- SCALA常规练习A
package com.hengheng.scala import scala.util.control.Breaks._ import scala.util.Random object Applic ...
- ISO 7810 协议小结
ISO 7816规定了Smart Card的传输协议分为 T=0 异步半双工字符传输协议 T=1 异步半双工块传输协议 T=0命令介绍 命令总是由接口设备启动,他以一个5字节的报头通知卡要做什么,然后 ...