一.最近在使用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框架搭建实例的更多相关文章

  1. EF框架搭建小总结--CodeFirst模型优先

    前言:之前在下总结编写了一篇 EF框架搭建小总结--ModelFirst模型优先 博文,看到一段时间内该博文的访问量蹭.蹭蹭.蹭蹭蹭...往上涨(实际也不是很多,嘿嘿),但是还是按捺不住内心的喜悦(蛮 ...

  2. EF框架搭建小总结--CodeFirst代码优先

    前言:之前在下总结编写了一篇 EF框架搭建小总结--ModelFirst模型优先 博文,看到一段时间内该博文的访问量蹭.蹭蹭.蹭蹭蹭...往上涨(实际也不是很多,嘿嘿),但是还是按捺不住内心的喜悦(蛮 ...

  3. Hibernate框架搭建实例

    一,Hibernate是一个持久层,是一个专门负责管理数据库连接的框架: 二,Hibernate的搭建实例: 1.在Hibernate的官方网站(http://www.hibernate.org)可以 ...

  4. EF框架搭建

    EF框架搭配lambda表达式使用起来非常高效便捷,有两种方法使用EF框架: 一是.添加“ADO.NET Entity Data Model”项,绑定配置数据库链接,勾选表和存储过程等,自动生成实体: ...

  5. EF框架搭建小总结--ModelFirst模型优先

    前言:去年刚工作的时候,也是刚刚正式接触.net,当时了解了EF以及三种开发模式,Database First.Model First .Code First.公司用的开发模式是Database Fi ...

  6. Spring+Spring MVC+Hibernate框架搭建实例

    前言:这里只是说明整个搭建流程,并不进行原理性的讲解 一 下面所需要用到的数据库配置: 数据库方面,使用mysql创建一个users表,具体代码如下: 1 2 3 4 5 6 7 8 9 10 11 ...

  7. Mybatis 框架搭建实例

    前言 MyBatis是一个优秀的持久层框架.原生的jdbc操作存在大量的重复性代码(如注册驱动,创建连接,创建statement,结果集检测等).框架的作用就是把这些繁琐的代码封装. MyBatis通 ...

  8. ssh框架搭建实例代码教程步骤

    http://blog.csdn.net/u010539352/article/details/49255729

  9. SSH框架总结(框架分析+环境搭建+实例源码下载) 《转》

    这篇文章比较易懂,易理解: 首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层W ...

随机推荐

  1. 请给出异步加载js方案

    请给出异步加载js方案,不少于两种 默认情况javascript是同步加载的,也就是javascript的加载时阻塞的,后面的元素要等待javascript加载完毕后才能进行再加载,对于一些意义不是很 ...

  2. python函数参数的pack与unpack

    python函数参数的pack与unpack 上周在使用django做开发的时候用到了mixin(关于mixin我还要写一个博客专门讨论一下,现在请参见这里),其中又涉及到了一个关于函数参数打包(pa ...

  3. Erget 显示对象

    核心显示类: 类 描述 DisplayObject 显示对象基类,所有显示对象均继承自此类 Bitmap 位图,用来显示图片 Shape 用来显示矢量图,可以使用其中的方法绘制矢量图形 TextFie ...

  4. Nginx 基本配置和日志分析

    最近在维护的一个项目,路由转发规则都统一通过Nginx转发,所以再次参考部分博文和书本,熟悉Nginx的基本配置,还有一个重点也是日志的分析 Nginx 常用模块是server块,location块. ...

  5. Sleep的问题

    先上全部源码: using System; using System.Threading; namespace MoveServices { public static class MoveWorke ...

  6. Linux前传——今天的学习

    感觉每天早上搞一个C语言的趣味题,很不错,算是比较实际的事情了.而且,好多都不会,主要是算法,也有很多语法不知道,这样补强很有用.嵌入式方面的课题进展有条不紊,感觉相关寄存器和I/O的使用必须通过大量 ...

  7. [转]Kafka/Metaq设计思想学习笔记

    收集的一些kafka的信息: http://my.oschina.net/geecoodeer/blog/194829

  8. Delphi COM编程学习笔记(1)

    释放接口对象,既不是调用MyObj.Free,也不是MyObj.Release;破坏对象的正确方法是将它们设置为nil:MyInterface := nil; 一个接口不能离开实现它的对象而独立存活. ...

  9. android 状态栏(StatusBar)

    一.SystemUI 概述 自 android2.2 开始 , 原本存在与 framework-res.apk 中的状态栏和下拉通知栏界面控制被分割出一个单独的 apk 文件 , 命名为 System ...

  10. BZOJ1715: [Usaco2006 Dec]Wormholes 虫洞

    1715: [Usaco2006 Dec]Wormholes 虫洞 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 475  Solved: 263[Sub ...