为什么要使用Entity Framework
本文介绍从DDD(Domain-Driven Design[领域驱动设计])的角度来说说为什么要使用Entity Framework(以下都会简称为EF),同时也看出类似Drapper之类的简陋ORM不足的地方。
设想业务都是大家知晓的权限管理,实体类如下。
public partial class User
{
/// <summary>
/// 用户名
/// </summary>
public string Username { get; set; }
/// <summary>
/// 用户密码
/// </summary>
public string Password { get; set; }
public virtual ICollection<Role> Roles { get; set; }
}
public partial class Role
{
/// <summary>
/// 角色ID
/// </summary>
public int ID { get; set; }
/// <summary>
/// 角色名称
/// </summary>
public string Name { get; set; }
}
读到这里,请先思考一下,给一个 User 添加一个新的 Role ,你会怎么写代码?,然后再接下去看看DDD认为应该怎么写。
//上面的User类,只是对数据库做简单映射的模型,在DDD思想中也称为 贫血模型
//接下来,我们把User类变成一个真正的 领域模型,也就是说 领域模型 会包含有业务逻辑!
public partial class User
{
/// <summary>
/// 给用户添加一个新的角色
/// </summary>
/// <param name="role"></param>
public void AddRole(Role role)
{
//业务逻辑:先判断该用户是否已经拥有该角色,没有才能添加。
if (!this.Roles.Any(x => x.ID == role.ID))
{
this.Roles.Add(role);
}
//这里的代码是Ado.Net,Drapper之类是做不到这样的。
//所以要实现DDD,必须配上EF之类的强大的ORM。
}
}
接下来,我们来看看怎么调用,可以看出一切都是围绕User这个领域模型的。
var user = userService.GetUserById(userId);
user.AddRole(role);//可以看出用了领域模型后,代码更加OOP了~
userService.Update(user);
更加理想的DDD,是连userService都不要,但目前很难实现这种做法。
var user = User.Init(userId);
user.AddRole(role);
user.SaveChange()
理想很丰满,现实很骨感,除了技术不能完全实现DDD的思想,我们还要考虑性能问题,
所以目前的DDD的做法是推荐搜索功能,也就是说搜索出现的数据作展示用,不会再对搜索出来的数据进行增删改,那么就怎么快怎么来。你爱用Drapper也行,用EF+原生Sql也行,用Ado.Net也行。
不是说面向过程化的思想不行,能抓老鼠的就是好猫。
但前辈们的经验是,面对复杂的业务,用DDD的思想来解决会更好。
所以
今天你OOP,DDD了吗?_
为什么要使用Entity Framework的更多相关文章
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- Entity Framework Core 1.1 升级通告
原文地址:https://blogs.msdn.microsoft.com/dotnet/2016/11/16/announcing-entity-framework-core-1-1/ 翻译:杨晓东 ...
- Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制
将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...
- 采用MiniProfiler监控EF与.NET MVC项目(Entity Framework 延伸系列1)
前言 Entity Framework 延伸系列目录 今天来说说EF与MVC项目的性能检测和监控 首先,先介绍一下今天我们使用的工具吧. MiniProfiler~ 这个东西的介绍如下: MVC Mi ...
- 来,给Entity Framework热热身
先来看一下Entity Framework缓慢的初始化速度给我们更新程序带来的一种痛苦. 我们手动更新程序时通常的操作步骤如下: 1)把Web服务器从负载均衡中摘下来 2)更新程序 3)预热(发出一个 ...
- 采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)
前言 Entity Framework 延伸系列目录 今天我们来讲讲EntityFramework.Extended 首先科普一下这个EntityFramework.Extended是什么,如下: 这 ...
- Entity Framework教程(第二版)
源起 很多年前刚毕业那阵写过一篇关于Entity Framework的文章,没发首页却得到100+的推荐.可能是当时Entity Framework刚刚发布介绍EF的文章比较少.一晃这么多年过去了,E ...
- Entity Framework 6 Recipes 2nd Edition 译 -> 目录 -持续更新
因为看了<Entity Framework 6 Recipes 2nd Edition>这本书前面8章的翻译,感谢china_fucan. 从第九章开始,我是边看边译的,没有通读,加之英语 ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第一章:创建基本的MVC Web站点
在这一章中,我们将学习如何使用基架快速搭建和运行一个简单的Microsoft ASP.NET MVC Web站点.在我们马上投入学习和编码之前,我们首先了解一些有关ASP.NET MVC和Entity ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之目录导航
ASP.NET MVC with Entity Framework and CSS是2016年出版的一本比较新的.关于ASP.NET MVC.EF以及CSS技术的图书,我将尝试着翻译本书以供日后查阅. ...
随机推荐
- MySQL复制(Replication)
引自:http://www.cnblogs.com/hustcat/archive/2009/12/19/1627525.html 1.复制概述 1.1.复制解决的问题数据复制技术有以下一些特点:(1 ...
- jdom解析xml
这次把代码整理了一下,打包发上来了,程序中需要用到的jar包也一起打在里面了,有兴趣的朋友可以解压后直接导入的eclipse里运行! xml是一种广为使用的可扩展标记语言,java中解析xml的方式有 ...
- svn 修改原来包名的方法和会报的错误
SVN E200009 which is not part of the commit; both sides of the move must be committed together 在svn上 ...
- regular exception
RegexBuddy :正则表达式编辑器. 正则表达式:通过特定的规则,选取特定的字符串. ^ 为匹配输入字符串的开始位置.$ 为匹配输入字符串的结束位置. \d匹配[0-9] \w匹配[A-Z a- ...
- 2018.10.27 bzoj1984: 月下“毛景树”(树链剖分)
传送门 唉蒟蒻又退化了,这道sb题居然做了20min,最后发现是updcovupdcovupdcov写成了updaddupdaddupdadd我还能说什么233233233 就是让你转边权为点权之后, ...
- ajax from 提交
$.ajax({ cache: true, type: "POST", url:aj ...
- pat1079+1086+1090+1094(树的遍历)感想
今天做了这4道题,虽然大部分以前做过,但还是有些知识掌握不全. 总结一下所用的树的知识及解决方法 (1)非二叉树的遍历: 非二叉树就是图,所以它的存储结构类似邻接表,c++提供了vector数组可以很 ...
- activemq部署
系统环境 IP salt-master-1:192.168.0.156 salt-master-2:192.168.0.157 node-test-1:192.168.0.158 node-test- ...
- jq,ajax,post例子。
jq post 例子 <script> $(function(){ $('#button').on('click', function(){ $.ajax({ type: 'POST', ...
- Python实现文件备份
Python实现文件拷贝 2017年8月27日 1.实现目的 统一时间对服务器某文件夹内文件进行备份保存,如若备份成功则不提示任何错误,否则将以邮件的形式告知管理员,备份出错. 2.程序流程图 主要流 ...