ORM--Entity Framework 学习(01)
关键词:
Entity Framework:微软官方提供的ORM工具,ORM让开发人员节省数据库访问的代码时间,将更多的时间放到业务逻辑层代码上。EF提供变更跟踪、唯一性约束、惰性加载、查询事物等。开发人员使用Linq语言,对数据库操作如同操作Object对象一样省事。
EF有三种使用场景:1. 从数据库生成Class,2.由实体类生成数据库表结构,3. 通过数据库可视化设计器设计数据库,同时生成实体类。
简单使用:
定义表
public class Assignment
{
public int ID { get; set; }
public int CourseID { get; set; }
public int InstructorID { get; set; }
public int Year { get; set; }
//Navigation Property,表关系
public Semester Semester { get; set; }
public Instructor Instructor { get; set; }
public Course Course { get; set; }
public ICollection<ScoreList> ScoreLists { get; set; }
public ICollection<ForumPost> ForumPosts { get; set; }
public ICollection<Homework> Homeworks { get; set; }
}
不用写额外的Annotation,ID字段自动成为主键,CourseID, InstructorID自动成为外键,值类型自动not null,空行下面的那些,EF里面叫Navigation Property,不是数据表的一部分,是多表join之后方便你直接访问join之后的部分的,表示了Entity之间的对应关系。
定义数据库上下文(这里是简单版的)
public class MyDataContext : DbContext
{
public MyDataContext(DbContextOptions<MyDataContext> options)
: base(options)
{ }
public DbSet<Assignment> Assignments { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Assignment>();
}
}
EF会自动替你分析表和表之间关系,一对多,多对多,多对一,都给你自动做好,然后级联删除也会自动给你做好,假如出现了环状的级联删除路径,你也可以手动指定级联删除的行为:
modelBuilder.Entity<Enrollment>()
.HasOne(e=>e.Student)
.WithMany(e=>e.Enrollments)
.OnDelete(DeleteBehavior.Restrict);
上面啥意思呢:一个Enrollment对应一个Student,同时一个Student对应多个Enrollments,手动建立的一对多关系,然后指定OnDelete啥都不干。
增:
_context.Enrollments.Add(new Models.Enrollment {
StudentID = id,
AssignmentID = assignmentID
});
_context.SaveChanges();
删:
_context.Enrollments.Remove(xxxxx);
_context.SaveChanges();
查:
查分三步:
1.瞬间多表join完成
var joinedTable = _context.Applications
.Include(a => a.Student)
.Include(a => a.Assignment)
.ThenInclude(a => a.Course)
.Include(a => a.Enrollment)
.ThenInclude(a => a.Assignment)
.ThenInclude(a => a.Course);
Include就是A join B,ThenInclude就是A join B join C
2.瞬间用linq完成查询
joinedTable.Where(e=>e.ID == id).OrderByDescending(e=>e.Time)
3.瞬间用匿名结构把东西送出去
var r = new
{
CourseName = data.Course.Title,
Homeworks = data.Homeworks.Select(e => new
{
Title = e.Title,
Description = e.Content,
StartDate = e.StartDate,
DueDate = e.DueDate,
}).OrderByDescending(e=>e.StartDate),
ForumPosts = data.ForumPosts.Select(e => new
{
Title = e.Title,
Content = e.Content,
PostTime = e.PostTime
}).OrderByDescending(e=>e.PostTime),
ScoreList = data.ScoreLists.Select(e => new
{
Title = e.Title,
}),
};
改:
直接改上面查部分中得到的实体,然后context.SaveChanges()就行了,不用构造update查询。
从头到尾没有一处操作是用拼接字符串生成的,从头到尾所有操作都支持事务回滚。瞬间觉得EF用起来好简单啊~
参考: http://www.cnblogs.com/xuf22/articles/5513283.html
https://zhuanlan.zhihu.com/p/26517319
ORM--Entity Framework 学习(01)的更多相关文章
- Entity Framework 学习整理(分播客整理)
MSDN: http://msdn.microsoft.com/en-us/data/aa937723 台湾博客: http://www.dotblogs.com.tw/yc421206/ http: ...
- Entity Framework 学习
Entity Framework 学习初级篇1--EF基本概况 Entity Framework 学习初级篇2--ObjectContext.ObjectQuery.ObjectStateEntry. ...
- Entity Framework 学习整理
MSDN: http://msdn.microsoft.com/en-us/data/aa937723 台湾博客: http://www.dotblogs.com.tw/yc421206/ http: ...
- Entity Framework 学习笔记(2)
上期回顾:Entity Framework 学习笔记(1) Entity Framework最主要的东西,就是自己创建的.继承于DbContext的类: /// <summary> /// ...
- Entity Framework学习笔记
原文地址:http://www.cnblogs.com/frankofgdc/p/3600090.html Entity Framework学习笔记——错误汇总 之前的小项目做完了,到了总结经验和 ...
- Entity Framework 学习中级篇1—EF支持复杂类型的实现
本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的简单操作. 通常,复杂类型是指那些由几个简单的类型组合而成的类型.比如:一张Customer表,其中有FristName和Las ...
- MVC5 Entity Framework学习
MVC5 Entity Framework学习(1):创建Entity Framework数据模型 MVC5 Entity Framework学习(2):实现基本的CRUD功能 MVC5 Entity ...
- Entity Framework学习初级篇2
Entity Framework 学习初级篇2--ObjectContext.ObjectQuery.ObjectStateEntry.ObjectStateManager类的介绍 本节,简单的介绍E ...
- ADO.NET Entity Framework学习笔记(3)ObjectContext
ADO.NET Entity Framework学习笔记(3)ObjectContext对象[转] 说明 ObjectContext提供了管理数据的功能 Context操作数据 AddObject ...
- MVC5 Entity Framework学习之实现主要的CRUD功能
在上一篇文章中,我们使用Entity Framework 和SQL Server LocalDB创建了一个MVC应用程序,并使用它来存储和显示数据.在这篇文章中,你将对由 MVC框架自己主动创建的CR ...
随机推荐
- springBoot2 基础语法
请求响应 request对象 request 对象其实是HttpServletRequest 类型, 通过它可以获取请求相关的一切信息, 包含请求信息 . 以及请求参数 ,甚至可以当成往里面存储数据[ ...
- PHP正则表达式函数的替代函数
1,preg_split()函数将字符串按照某元素分割,分割后结果以数组方式返回. php中explode()可以实现此功能.array explode(string $pattern,string ...
- sudoer命令各参数含义及设置
对于普通用户sudo加权的时限制可以执行的命令 https://segmentfault.com/a/1190000007394449 需要修改/etc/sudoers 1. 字段说明如下 授权用户/ ...
- 【xsy2506】 bipartite 并查集+线段树
题目大意:有$n$个点,你需要操作$m$次.每次操作为加入/删除一条边. 问你每次操作后,这$n$个点构成的图是否是二分图. 数据范围:$n,m≤10^5$. 此题并没有强制在线,考虑离线做法. 一条 ...
- Runtime 全方位装逼指南
Runtime是什么?见名知意,其概念无非就是“因为 Objective-C 是一门动态语言,所以它需要一个运行时系统……这就是 Runtime 系统”云云.对博主这种菜鸟而言,Runtime 在实际 ...
- dotnetcore+vue+elementUI 前后端分离 三(前端篇)
说明: 本项目使用了 mysql employees数据库,使用了vue + axois + element UI 2.0 ,演示了 单页程序 架构 ,vue router 的使用,axois 使用, ...
- sql练习(针对Mysql)
创建表: DROP TABLE DEPT; --部门表 CREATE TABLE DEPT( DEPTNO int PRIMARY KEY, DNAME ) , --部门名称 LOC ) ---部门地 ...
- (转)WebSphere禁用SSLv3和RC4算法教程
原文:https://www.cnblogs.com/lsdb/p/7126399.html WebSphere经常会报“SSL 3.0 POODLE攻击信息泄露”和"SSL/TLS 受诫礼 ...
- Python:快速查找出被挂马的文件
网站被入侵,担心被挂马,因此就想自己写个脚本来查找那些被挂马的文件 思路 需要实现准备一份未受感染的源代码和一份可能受感染的源代码,然后运行以下脚本,就能找出到底哪些文件被挂马了. 其中,主要是根据比 ...
- ASP.NET MVC网站使用新浪微博账号登录
首先到http://open.weibo.com/development 注册一个开发者账号. 然后可以点微连接--网站接入 会分配App Key 和App Secret 然后点高级信息 在这里设置回 ...