本次学习用的数据库,如下

1.什么是DTO:DataTransferObject

即数据传输对象,服务端的客户端的通信,自动定义个小的实体类,里面只包含我们需要传输的属性

2.不用DTO会有什么问题

a.在用JavaScriptSerializer时,会报错

原因:Teacher实体中有外键实体TeachClass,而TeachClass中又有一个Teacher的集合属性,然后会一直循环的查询,出现死循环

b.使用json返回数据时,会出错

3.使用DTO解决问题

现在问题:

在序列化Teacher对象时,会去找外键实体TeachClass;而去找TeachClass对象时,又会重新找Teacher,一直到循环。

开始解决:

a.定义DTO类,解决死循环

我们可以定义个新的TeachClass类,它里面不包含会引起死循环的属性,即没有ICollection<Teacher>属性。此处我们也对Teacher重新声明一个类。

b.定义部分类,方便添加额外方法

死循环问题就这么解决了,这就是DTO,简单吧。接下来,我们可能很多地方要用到序列化,那我们为了方便,直接在类的内部定义一个方法,自己序列化自己。但是问题又来了,因为实体类是EF生成的,每次我们点击保存,EF就会按照tt模板和xml配置信息,重新初始化类,我们写的方法就白写了。这个时候,我们想到了部分类,在部分类中一个序列化该类的方法。

有个主意事项,因为EF在找类时是根据文件名来找,所以此处的类名 不能与 类文件名相同

c.开始使用自己定义的DTO类

发现下载程序正常运行,未报任何异常,搞定

MVC系列学习(九)-DTO的使用的更多相关文章

  1. bootstrap-data-target触发模态弹出窗元素的data使用 data-toggle与data-target的作用 深入ASP.NET MVC之九:Ajax支持 Asp.Net MVC4系列--进阶篇之AJAX

    bootstrap-data-target触发模态弹出窗元素的data使用 时间:2017-05-27 14:22:34      阅读:4479      评论:0      收藏:0      [ ...

  2. [转]ASP.NET MVC 4 (九) 模型绑定

    本文转自:http://www.cnblogs.com/duanshuiliu/p/3706701.html 模型绑定指的是MVC从浏览器发送的HTTP请求中为我们创建.NET对象,在HTTP请求和C ...

  3. mvc开发中DTO,DO,FROM的区别

    DO:数据库实体类映射到model里的实体类,每个字段都和数据库相对应,一般来说开发的时候不要去添加或者修改里面的实体 DTO:与前台交互的时候(一般来说是查询操作)有一些数据字段是那一张表里面没有囊 ...

  4. ASP.NET MVC 4 (九) 模型绑定

    模型绑定指的是MVC从浏览器发送的HTTP请求中为我们创建.NET对象,在HTTP请求和C#间起着桥梁的作用.模型绑定的一个最简单的例子是带参数的控制器action方法,比如我们注册这样的路径映射: ...

  5. MVC教程九:异常过滤器

    我们平常在程序里面为了捕获异常,会加上try-catch-finally代码,但是这样会使得程序代码看起来很庞大,在MVC中我们可以使用异常过滤器来捕获程序中的异常,如下图所示: 使用了异常过滤器以后 ...

  6. [转]深入ASP.NET MVC之九:Ajax支持

    本文转自:http://www.cnblogs.com/yinzixin/archive/2012/12/22/2824384.html 目前前端页面和服务端进行Ajax交互大多采用的都是jQuery ...

  7. MVC系列学习(十五)-验证码

    1.方式一: public class VCode { /// <summary> /// 生成验证码图片 字节数组 /// </summary> /// <return ...

  8. MVC系列学习(十三)-合并JS和CSS

    1.先来看看,不用合并js的情况,传输量大 1.1新建一个 [基本]的mvc项目 然后新建一个控制器HomeController,因为js会在很多视图中用到,所以此时我们添加一个视图带布局页Index ...

  9. MVC系列学习(十一)-客户端的验证

    1.通过一个实例,来了解MVC中强大的验证功能 1.1新建一个 [基本] 的mvc项目,因为要用到验证的js,然后在一个视图中写上一下代码,以及Model中的代码如下 [注]在调用html.EditF ...

随机推荐

  1. redis 指定端口 启动

    由于资源紧张 需要多创建一个redis实例 重新copy一份实例,然后修改redis.conf文件, 找到port 6379 处修改 端口号 6380 通过下面命令启动就好了 src/redis-se ...

  2. [luoguP1316] 丢瓶盖(二分答案)

    传送门 二分答案再判断即可 ——代码 #include <cstdio> #include <iostream> #include <algorithm> #def ...

  3. SGU - 321 - The Spy Network

    先上题目: 321. The Spy Network Time limit per test: 0.5 second(s)Memory limit: 65536 kilobytes input: st ...

  4. 推销员(codevs 5126)

    题目描述 Description 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有N家住户,第i家住户到入口的距 ...

  5. Ubuntu 16.04安装Kdbg替代Insight实现汇编的调试

    Insight已经不能使用APT进行安装,且如果使用源码安装时需要修改.所以只能放弃,转投使用Kdbg. 安装: sudo apt-get install kdbg 使用: nasm -f elf64 ...

  6. SVN提交时报错:Commit blocked by pre-commit hook (exit code 1) with no output.

    可能的原因: 提交代码的SVN命令中,Comment长度短了.参考:http://tortoisesvn.net/docs/nightly/TortoiseSVN_en/tsvn-howto-minl ...

  7. Linux自己主动挂载第二块硬盘分区

    改动/etc/fstab文件,如果挂载到/data文件夹.在最后一行加上 /dev/sdb1 /data ext4 defaults 1 1 最后结果例如以下: # # /etc/fstab # Cr ...

  8. iOS推断当前控制器是否在显示

    当点击一个cell或者button的事件,处理比較耗时,在异步线程中执行中.当子线程得到执行结果时可能不在当前控制器上了.此时我们须要取消子线程后边的事情. 此刻,当得到结果时须要推断是否在当前控制器 ...

  9. C++学习之函数模板与类模板

    泛型编程(Generic Programming)是一种编程范式,通过将类型参数化来实现在同一份代码上操作多种数据类型,泛型是一般化并可重复使用的意思.泛型编程最初诞生于C++中,目的是为了实现C++ ...

  10. xul 创建一个按钮

    MDN Mozilla 产品与私有技术 Mozilla 私有技术 XUL Toolbars 添加工具栏按钮 (定制工具栏) 添加工具栏按钮 (定制工具栏) 在本文章中 创建一个 overlay 在工具 ...