数据库表间多对多关系(附带额外字段)的实体类(POJO 或 POCO)表示
介绍
在之前的 Entity Framework 快速上手介绍 之中,两个实体之间只是简单的一对一关系,而在实际的应用场景中,还会出现多对多关系,同时还有可能会出现多对多关系还附带有其他字段的情况。
下面以几个例子,对表间多对多关系的类表示加以更加详细地描述。虽然两个场景举例是使用的 C# 及 Entity Framework(Model First) 框架自动生成数据库、实体类。但这种设计方法,并不只是在使用 ORM 框架时需要,事实上,它是 POCO 及简单 Java 类(POJO)的设计原则之一。
场景实例
场景一
在考虑多对多关系还附带有字段的情况之前,让我们先看一下,多对多关系但不附带额外字段的情况下,实体类代码的表示。
此处使用 Entity Framework(Model First),快速将 model diagram 转为数据库中的表及实体类。
假设的场景是学生选课,一名学生可以选多门课,一门课也可以被多个学生选择。E-R 图如下所示:

对应自动生成的数据库如下:

- StudentSet

- CourseSet

- CourseRegistrationSet
- 其中 Course_Id 与 Students_Id(注:此处词尾(s)负数的原因参见上面 E-R 图中右边的 Properties 中 End1 Navigation Property 的设置)分别以另外两张数据表的 Id 主键作为外键。
- 同时 Course_Id与 Students_Id 两者联合做 CourseRegistrationSet 表的主键。
对应自动生成实体类的代码如下:
- Student.cs
namespace Model
{
using System;
using System.Collections.Generic;
public partial class Student
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Student()
{
this.Course = new HashSet<Course>();
}
public int Id { get; set; }
public string 学号 { get; set; }
public string 姓名 { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Course> Course { get; set; }
}
}
- Course.cs
namespace Model
{
using System;
using System.Collections.Generic;
public partial class Course
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Course()
{
this.Students = new HashSet<Student>();
}
public int Id { get; set; }
public string 课程名称 { get; set; }
public string 学分 { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Student> Students { get; set; }
}
}
分析
- 数据库表之间一对一、一对多的关系在代码中是通过 对象引用 或 对象数组/List等形式的引用 实现的。
- 从实例中可以看出,CourseRegistrationSet 表中的多对多关系在代码中的表现形式同样是实体类中的 对象List等形式的引用,只不过多对多关系是多个实体类中都存在其他实体类对象List的引用。
场景二
现在让我们增加一个需求,实际应用之中,数据库不可能仅仅存储某学生选了某门课程这些信息,同时还需要保存选课时间、操作人、成绩等等信息。
现在让我们为 CourseRegistrationSet 表增加一个字段——成绩。
- CourseRegistrationSet

同时我们需要更新一下程序中的代码,这时候问题出现了
数据库表间多对多关系(附带额外字段)的实体类(POJO 或 POCO)表示的更多相关文章
- 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效
数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...
- 【mysql】如何通过navicat配置表与表的多对一关系,一对一关系?设计外键的效果
背景: 现在要将接口自动化测试结果持久化,当前只是每次运行接口测试,将测试结果通过邮件发送给项目组成员.邮件内容如下: 表设计: 为了呈现这个结果:我设计了2张表run_result和run_deta ...
- django--ORM表的多对一关系
多对一关系是什么 Django使用django.db.models.ForeignKey定义多对一关系. ForeignKey需要一个位置参数:与该模型关联的类 class Info(models. ...
- 查询sqlserver中所有的数据库表 与 查询表中的说明注释字段
1.查询数据库中所有的数据库表 SELECT * FROM sysobjects WHERE xtype = 'u' AND name != 'sysdiagrams'; 2.查询数据库表中的说明字段 ...
- EF时,数据库字段和实体类不一致问题
场景:由于一些原因,实体中属性比数据库中字段多了一个startPage属性.PS:controllers中用实体类去接收参数,但是传入的参数比数据库中实体表多了一个字段, 这种情况下,应该建一个vie ...
- Django笔记-数据库操作(多对多关系)
1.项目结构 2.关键代码: data6.settings.py INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', ' ...
- mysql数据库表间内外链接详解
1. 内连接(自然连接) 2. 外连接 (1)左外连接 (左边的表不加限制)(2)右外连接(右边的表不加限制)(3)全外连接(左右两表都不加限制) 3. 自连接(同一张表内的连接) SQL的标准语法: ...
- 数据库字段和实体类和map中对应类型
http://blog.csdn.net/sxe18652071425/article/details/46416217 地址 MySQL数据类型 JAVA数据类型 JDBC TYPE 普通变量类型 ...
- @Select 数据表的字段与实体类的属性值
添加@Results @Select("select * from goods") @Results({ @Result(property = "id", co ...
随机推荐
- VS 2017 Git failed with a fatal error的解决办法
前几天,满怀欣喜的从VS2015更新到了VS2017,经过这几天的试用,整体来说感觉还是挺不错的.昨天推送项目到远程服务器的时候,发现出现了推送失败的错误,错误如图: 按照提示,我看到输出窗口的输入内 ...
- 脚本语言:Xmas(一)
很偶然的一个想法,在从北京回成都的高铁上:我想要一个计算器.于是在火车上花了十来个小时,完成了一个模型:能够处理+-*/的优先级,以及"()",比如:1+(3+2)*4.这已是一年 ...
- php基础知识(二)---2017-04-14
1.字符串的三种表达形式: (1)双引号 (2)单引号 (3)尖括号 $s = <<<A <div style="width:500px; height:100px; ...
- MySQL之数据类型(常用)
MySQL-data_type数据类型 1.查看数据类型 mysql> help data type //通过help对数据进行查看,以及使用的方法 2.MySQL常见的数据类型 整数in ...
- Linux:一位猫奴的意外产物
作者:Vamei,严禁任何形式转载. 1991年年中,林纳斯·托瓦兹(Linus Torvalds)在自己房间里敲着键盘.他全神贯注地盯着14寸的黑色屏幕,都没感觉到自己的小猫Randi在扒自己的裤腿 ...
- NOIP2014D2T2寻找道路
洛谷传送门 这道题可以把边都反着存一遍,从终点开始深搜,然后把到不了的点 和它们所指向的点都去掉. 最后在剩余的点里跑一遍spfa就可以了. --代码 #include <cstdio> ...
- C++ 中关于optional 使用过程中遇到的问题
头文件:#include <boost/optional.hpp> using namespace boost; optional很像一个仅能存放一个元素的容器,它实现了"未初始 ...
- C# 调用C++dll出现的问题。
问题描述: 对 PInvoke 函数“winform应用!winform应用.Form1::add”的调用导致堆栈不对称.原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配.请检查 PIn ...
- 在jquery中each循环中,要用return false代替break,return true代替continue。
在jquery中each循环中,要用return false代替break,return true代替continue. $.each(data, function (n, value) { if(v ...
- 简谈-Python的输入、输出、运算符、数据类型转换
输出: 格式化输出: 看到了 % 这样的操作符,这就是Python中格式化输出. 换行输出: 在输出的时候,如果有 \n 那么,此时 \n 后的内容会在另外一行显示 输入: 在python2.7当中, ...