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 ...
随机推荐
- JQUERY1.9学习笔记 之内容过滤器(一) 包含选择器
描述:选择包含指定文本的所有元素.jQuery( ":contains(text)" ) text:一串大小写敏感的文本. 例:找出所有包含"john"的div ...
- PHP 运算符 详解
PHP 算数运算符 运算符 名称 例子 结果 + 加法 $x + $y $x 与 $y 求和 - 减法 $x - $y $x 与 $y 的差数 * 乘法 $x * $y $x 与 $y 的乘积 / 除 ...
- 织梦DedeCMS子目录移动到根目录的方法
有时候我们在子目录中安装了dedecms,但有时候需要将其换到根目录中,下面就讲一下织梦DedeCMS子目录移动到根目录的方法: 下面是具体的操作步骤,强烈建议先备份数据库. 1.进入dedecms后 ...
- apache静态文件配置
开发环境配置 需要下面几个步骤 1. 在app目录下创建static目录,将静态文件和相关文件夹放到此目录下,如your_app/static/img等 2. 确保settings.py中的INSTA ...
- C语言的算法--------二分法查找
int find(int n,int a[],int l){int low=0;int high=l-1;int middle=0;while(low<high){middle=(low+hig ...
- poj 2782 Bin Packing (贪心+二分)
F - 贪心+ 二分 Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Description ...
- UVa 129 Krypton Factor困难的串 (dfs 递归搜索)
回溯法,只需要判断当前串的后缀,而不是所有的子串 #include<iostream> #include<cstdio> using namespace std; ]; int ...
- HDU 1005(周期问题)
HDU 1005 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descript ...
- WPS怎样设置多级标题(如四级标题)
WPS期初,乍一看最多只能设置三级标题. 怎样设置四级以上标题呢? 这里以设置四级标题为例: 点击‘视图’->'大纲', 假如,现在2.3.3这一行是三级标题: 在下拉框里选择‘4级’就可以了. ...
- POJ2524 Ubiquitous Religions(并查集)
题目链接. 分析: 给定 n 个点和 m 条无项边,求连通分量的数量.用并查集很简单. #include <iostream> #include <cstdio> #inclu ...