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中手动 ...
随机推荐
- unity luaFramework
1 AppConst: DebugMode: 调试模式,true:lua脚本直接读取自 AssetDir,false:开始会将AssetDir内的lua脚本复制到 Util.DataPath内(根据平 ...
- tomcat探索
双击apache-tomcat-7.0.64.exe,一路默认点. 静态页路径 C:\Program Files\Apache Software Foundation\Tomcat 7.0\webap ...
- Java学习总结1
1. 断点调试 a:定位(设置断点) b:启动调试 c:单步执行 观察变量(F5单步执行 F6单步跳过)d:修改2 static 静态 静态成员,为类的所有对象共享 在静态方法中,只能 ...
- 通用Mapper
原理是:拦截器 1.假设:使用MyBatis只需要定义Mapper接口,无需编写Mapper.xml文件 如果实现无需编写Mapper.xml文件,我们必须要实现动态拼接SQL 如何实现动态拼接SQL ...
- Bootstrap之Bootstrap组件
一 文本居中 col-xx-offset-xx:水平居中 center-block:使用于不涉及float标签的水平居中,也不涉及列的居中,让哪里居中就写到哪里,本质是:margin:0 auto. ...
- windows mysql绿色版配置
MySQL绿色版安装 1.下载地址 https://dev.mysql.com/downloads/mysql/ 2.配置my.ini 文件 解压下载文件到指定目录.如: my.ini文件内容: [m ...
- WebSocket的原理与优缺点
websocket 是长连接,受网络限制比较大,需要处理好重连,比如用户进电梯或电信用户打个电话网断了,这时候就需要重连,如果 ws 一直重连不上,有些较复杂的业务方会不愿意的,是不是还要搞个 htt ...
- Codeforces Round #523 (Div. 2) E. Politics(最小费+思维建图)
https://codeforces.com/contest/1061/problem/E 题意 有n个点(<=500),标记第i个点的代价a[i],然后分别在这n个点建两棵树,对于每颗树的每个 ...
- mysql学习之路_连接查询
回顾 列属性:主键,自增长,唯一键. 关系:一对一,一对多,多对多 三层范式: 1NF:字段设计必须符合原子性 2NF:不存在部分依赖(没有复合主键) 3NF:不存在传递依赖(实体单独成表) 逆规范化 ...
- Windows下用curl命令
一开始自己是下载curl的可执行文件来弄的,发现中文会乱码: 按照网上的用chcp 65001后中文还是乱码,蒙逼中. 后来直接用git bash执行curl,发现git bash自带了这个命令:(可 ...