EF Core创建实体的Code First标准方法
针对关系型数据库,实体之间的关系最常见的就是通过外键关联的一对一、一对多和多对多的关系,新的EF Core通过注释和Fluent API 能够做到接近于数据库通过DML创建模型的效果了。实际上,通过DML 最大的优势在于,能够定义所谓的Independent/Dependent Entity具体的那个字段作为关联字段,而EF更多通过一种约定去描述这种关联关系,不过通过Fluent API 能够收工定义的操作范围更近广了。
下面的这个表关系实际上描述了大部分关系型数据库的关联关系,能够覆盖大部分场景,通过这个例子去说明Code First 创建实体的标准方法。

Members 和Tasks 关系,Member是Independent Entity, Tasks是Dependent Entity,定义类如下:
namespace MemberTask.Models
{
public partial class Members
{
[Key]
public int? MemberId { get; set; }
public string MemberName { get; set; }
[InverseProperty("Members")]
public List<Tasks> Tasks { get; set; } }
}
namespace MemberTask.Models
{
public partial class Tasks
{
[Key]
public int? TaskId { get; set; }
public int TaskName { get; set; }
public int MemberId { get; set; }
[ForeignKey("MemberId")]
public Members Members { get; set; }
//part of many2many
[InverseProperty("Task")]
public List<TaskAndOaTasksR> TaskAndOaTasksRs { get; set; }
}
}
在这两个实体的关系中:
先看Tasks类(红色字体部分),通过注释指明,MemberId 字段作为外键,而Members引用导航属性,作为外键所关联依赖的对象。
Members类,Tasks 列表导航属性就是被引用对象,而注释表明Members 就是Tasks中的引用导航属性Members。
另外3个实体店关系为,Tasks和OaTasks是业务实体,TaskAndOaTasksRs实际上作为一个中间表,提供一种多对多的关系,这种模式实际上是作为灵活的一种实体模式,虽然有一定的空间损耗,但是无论哪种关系,或者未来需要扩展成为多对多的关系可以随时实施。
OaTasks:
namespace MemberTask.Models
{
public partial class OaTasks
{
[Key]
public int? OaTaskId { get; set; }
public string OaTaskName { get; set; }
[InverseProperty("OaTask")]
public List<TaskAndOaTasksR> TaskAndOaTasksRs { get; set; } }
}
TasksAndOaTasksRs:
namespace MemberTask.Models
{
public partial class TaskAndOaTasksR
{
public int? TaskId { get; set; }
[ForeignKey("TaskId")]
public Tasks Task { get; set; }
[ForeignKey("OaTaskId")]
public int? OaTaskId { get; set; }
public OaTasks OaTask { get; set; } }
}
TasksAndOaTasksRs在实际上使用的时候,是不需要实现TaskId查询关联的多个OaTaskId的,仅仅查询TaskId & OaTaskId 的一一对应关系,因此通过引用导航属性引用Tasks 和OaTasks。相反,Tasks 和OaTasks都有需要进行一对多关联查询,因此采用了列表导航属性。
模型建好后,根据实际情况配置DbContext,特别是针对外键关联,根据实际情况定义好OnDelete方法。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Members>()
.Property(b => b.MemberId).ValueGeneratedNever();
modelBuilder.Entity<Tasks>()
.Property(t => t.TaskId).ValueGeneratedNever();
modelBuilder.Entity<OaTasks>()
.Property(o => o.OaTaskId).ValueGeneratedNever(); modelBuilder.Entity<Tasks>()
.HasOne(m=>m.Members)
.WithMany(t=>t.Tasks)
.OnDelete(DeleteBehavior.Cascade); // below is for many2many
modelBuilder.Entity<TaskAndOaTasksR>()
.HasOne(t => t.Task)
.WithMany(tt => tt.TaskAndOaTasksRs); modelBuilder.Entity<TaskAndOaTasksR>()
.HasOne(t => t.OaTask)
.WithMany(tt => tt.TaskAndOaTasksRs); modelBuilder.Entity<TaskAndOaTasksR>()
.HasKey(t => new {t.TaskId, t.OaTaskId}); }
运行数据库更新命令,实体和数据库模型就建好了。
EF Core创建实体的Code First标准方法的更多相关文章
- ASP.NET Core 中使用EF Core 将实体映射到数据库表的方法(SQL Server)
前段时间听过一个关于使用ASP.NET Core建立项目的视频.其中使用EF Core映射到数据库的部分是按部就班地学习.今天自己建立项目时,有些步骤已经有一些遗忘.所以写下这篇文章,顺便理清思路. ...
- EF Core For Oracle11中Find FirstOrDefault等方法执行失败
问题描述 最近在使用ef core连接oracle的发现Find.FirstOrDefault.Skip Task分页等等方法执行失败.使用的是docker安装的oracle11,错误如下图: 解决办 ...
- EF Core开发模式之Code First
Code First顾名思义,代码为先.首先编写完相关的实体类及DbContext派生类,然后通过映射关系自动在数据库中完成数据库表的创建. 本例中创建一个班级和学生的管理,主要有班级类MyClass ...
- ASP.NET Core中使用EF Core(MySql)Code First
⒈添加依赖 MySql.Data.EntityFrameworkCore ⒉在appsettings.json配置文件中配置数据库连接字符串 { "Logging": { &quo ...
- EF Core 中DbContext不会跟踪聚合方法和Join方法返回的结果,及FromSql方法使用讲解
EF Core中: 如果调用Queryable.Count等聚合方法,不会导致DbContext跟踪(track)任何实体. 此外调用Queryable.Join方法返回的匿名类型也不会被DbCont ...
- 张高兴的 Entity Framework Core 即学即用:(一)创建第一个 EF Core 应用
写在前面 Entity Framework Core (EF Core) 是 .NET 平台流行的对象关系映射(ORM)框架.虽然 .NET 平台中 ORM 框架有很多,比如 Dapper.NHibe ...
- [翻译 EF Core in Action 2.2] 创建应用程序的数据库上下文
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- EF Core 快速上手——创建应用的DbContext
系列文章 EF Core 快速上手--EF Core 入门 EF Core 快速上手--EF Core的三种主要关系类型 本节导航 定义应用的DbContext 创建DbContext的一个实例 创建 ...
- EF Core 2.0中如何手动映射数据库的视图为实体
由于Scaffold-DbContext指令目前还不支持自动映射数据库中的视图为实体,所以当我们想使用EF Core来读取数据库视图数据的时候,我们需要手动去做映射,本文介绍如何在EF Core中手动 ...
随机推荐
- sql 用Group by分组后,取每组的前几条记录
转自:http://blog.163.com/jeson_lwj/blog/static/135761083201052411115783/ --查询每门课程的前2名成绩 CREATE TABLE S ...
- easyui validate -- radio、checkbox 校验扩展,事件域名
事件域名: $(dom).on('click.myNameSpace',function(){ ... }),其中‘.myNameSpace’便是域名: 目前作用:$(dom).off('click. ...
- 1.preparation
1)Evarobot 安装 http://wiki.ros.org/Robots/evarobot/Tutorials/indigo/Evarobot%20Installation 2)PC 安装 a ...
- ios 基础知识篇 堆和栈的区别
前言 堆和栈是什么?有什么区别?是干嘛的? 内存管理 移动设备的内存及其有限,每一个APP所能占用的内存是有限制的 (吐槽一下:iPhone6s还是16G起步,还好我也买不起->_-> 扯 ...
- 2018.12.08 codeforces 946D. Timetable(背包)
传送门 题意简述:有一个人上n天课,每天有m个小时的时间安排表(一个01串),为1表示要上课,否则不上课,求出如果可以最多翘kkk节课这nnn天在校待的总时间的最小值(一天必须在所有课上完后才能离开) ...
- 安卓逆向学习---初始APK、Dalvik字节码以及Smali
参考链接:https://www.52pojie.cn/thread-395689-1-1.html res目录下资源文件在编译时会自动生成索引文件(R.java ), asset目录下的资源文件无需 ...
- PHP源码编译安装
cd php-5.6.0yum -y install libcurl-devel bzip2-devel zlib-devel libjpeg-devel libpng-devel freetype- ...
- BZOJ 2120 数颜色 (带修莫队)
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 6367 Solved: 2537[Submit][Status][Discuss] ...
- react优化--pureComponent
shouldComponentUpdate的默认渲染 在React Component的生命周期中,shouldComponentUpdate方法,默认返回true,也就意味着就算没有改变props或 ...
- 利用JDK自带的keytool生成SSL证书然后导入到SpringBoot
一:生成命令如下(这一步生成的暂不知道干嘛用的) E:\Desktop\Documents\证书>keytool -genkey -alias tomcat -keypass - -validi ...