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截取字符串分隔符中间部门的办法
需求:实际项目中需要截取第2到第3个逗号中间部分的内容 方案: declare @str nvarchar(50);set @str='11,222,3333,44444';select @str a ...
- php emoji mysql保存和搜索
MySQL版本>=5.5.3 表字符集: utf8mb4 解决保存 排序规格: utf8mb4_bin 解决搜索 PHP: set names utf8mb4 操作系统: WIN10 MAC
- rbenv安装本地ruby安装包
cd .rbenv mkdir cache #把安装包拷进cache cd cache rbenv install 版本号
- 2019.01.22 bzoj2874: 训练士兵(主席树)
传送门 题意简述:给出一个n∗mn*mn∗m的矩阵n,m≤1e8n,m\le1e8n,m≤1e8,支持矩形加,矩形求和,强制在线. 思路:第一眼二维动态开点线段树,上网去搜有没有这种做法发现会被卡时空 ...
- jQuery动态控制下拉列表的被选项[转]
<form id="form" action="/query!query.action"> <select> <option va ...
- mybatis中文官网
http://www.mybatis.org/mybatis-3/zh/index.html
- 微信小程序请求数据
微信小程序请求数据,在页面展示,可以在onLoad生命周期中进行请求. 1.新建目录http,新建文件http.js 2.在js文件中暴露需要使用的变量 var baseUrl = 'http://1 ...
- js动态删除某一行,内容超出单元格后超出的部分用省略号代替
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <s ...
- P750 内存插槽
查看p750内存插槽占用情况 lscfg -vp | grep -p DIMM Memory DIMM: Record Name.................VINI Flag Field.... ...
- 【repost】对JAVASCRIPT匿名函数的理解(透彻版)
Query片段: view plaincopy to clipboardprint? (function(){ //这里忽略jQuery所有实现 })(); 半年前初次接触jQuery的时候,我也像其 ...