本文主要讲EF一对多关系和多对多关系的建立

一、模型设计器

1、一对多关系

右键设计器新增关联

导航属性和外键属性可修改

2、多对多关系

右键设计器新增关联

模型设计完毕之后,根据右键设计器根据模型生成数据库,就能生成对应的表之间的一对多和多对多关联

二、代码层面

建表语句如下:

--建表脚本
create table Student
(
Id int not null,
Name varchar(30) not null,
Age int not null
)
create table Teacher
(
Id int not null,
Name varchar(30) not null,
Age int not null
) create table StudentTeacher
(
StudentId int not null,
TeacherId int not null
) create table InfoCard
(
Id int not null,
[Money] int not null,
StudentId int not null
)

添加常规主键约束,代码如下:

--单主键约束
alter table Student add constraint [PK_People]
primary key clustered (Id Asc) alter table InfoCard add constraint [PK_InfoCard]
primary key clustered (Id Asc) alter table Teacher add constraint [PK_Teacher]
primary key clustered (Id Asc)

1、一对多(通过外键)

--但外键约束(一对多)
alter table InfoCard add constraint [FK_InfoCard_Student]
foreign key (StudentId) references Student (Id) on delete no action on update no action

2、多对多(中间表双主键双外键)

--双主键约束(多对多)
alter table StudentTeacher add constraint [PK_StudentTeacher]
primary key clustered (StudentId,TeacherId Asc) --双外键约束(多对多)
alter table StudentTeacher
add constraint [FK_StudentTeacher_Student]
foreign key (StudentId) references Student (Id) on delete no action on update no action --级联更新级联删除 alter table StudentTeacher add constraint [FK_StudentTeacher_Teacher]
foreign key (TeacherId) references Teacher (Id) on delete no action on update no action

生成对应的一对多和多对多关联的表之后,根据数据库生成模型就能生成对应的模型

三、多对多无载荷

根据上面的建表语言,我们能得出Teacher表和Student表在数据库中的关系如下图:

数据库关系图:

在模型设计器中的关系如下图:

模型设计图:

观察二图的区别,发现数据库表关系图中的StudentTeacher(链接表)没有出现在模型设计器中。原因如下:

因为链接表没有标量属性(没有载荷),实体框架认为它存在的唯一价值就是联结Teacher和Student,没有标量属性的联结表,在各自的实体中将以ICollection集合的形式出现.

当然如果链接表有标量属性,那么模型设计器就会创建一个完成的类来表示链接表。

四、多对多无载荷增改

            // 添加demo
using (var context = new EF6RecipeEntities())
{
//给一个Teacher添加几个Student
var teacher1 = new Teacher
{
Id=,
Name = "张老师",
Age =
};
var stu1 = new Student
{
Id = ,
Name = "张三",
Age =
};
var stu2 = new Student
{
Id = ,
Name = "李四",
Age =
};
context.Teacher.Add(teacher1);//添加老师teacher1
teacher1.Student.Add(stu1);//给老师添加学生stu1
teacher1.Student.Add(stu2);//给老师添加学生stu2 //给一个Student添加几个Teacher
var stu3 = new Student
{
Id = ,
Name = "小超",
Age =
};
var t2 = new Teacher
{
Id = ,
Name = "王老师",
Age =
};
var t3 = new Teacher
{
Id = ,
Name = "赵老师",
Age =
};
context.Student.Add(stu3);
stu3.Teacher.Add(t2);
stu3.Teacher.Add(t3);
context.SaveChanges();
} //遍历所有老师下面的所有学生
using (var context = new EF6RecipeEntities())
{
DbSet<Teacher> ts = context.Teacher;
foreach (var t in ts)
{
Console.WriteLine("姓名:{0},年龄:{1},职位:{2},其管理的学生如下:", t.Name, t.Age, "老师");
var stus = t.Student;
foreach (var s in stus)
{
Console.WriteLine("姓名:{0},年龄:{1},职位:{2}", s.Name, s.Age, "学生");
}
Console.WriteLine();
}
}
Console.ReadKey();

五、多对多有载荷

上面学生和老师的例子并不能很好的说明多对多有载荷的问题,所以换成订单和产品,所以链接表将会产生一个订单数量的载荷(也就是链接表多了一个标量属性),

模型设计图如下:

有载荷的多对多关系比无载荷的多对多关系更加的简介明了。因为实体框架不支持在关联上附加载荷,所以有载荷的联结将会生成一个新的实体.

因为这个附加的载荷,Order需要通过OrderItem来获取与其关联的Product的项.

六、多对多有载荷增查

            //添加
using (var context = new EF6RecipeEntities())
{
var product = new Product
{
Id = ,
Desc = "面包",
Price =
};
var order = new Order
{
Id = ,
OrderDate = DateTime.Now
};
var orderItem1 = new OrderItem
{
Order = order,
Product = product,
Count =
};
product = new Product
{
Id = ,
Desc = "牛奶",
Price =
};
var orderItem2 = new OrderItem
{
Order = order,
Product = product,
Count =
};
product = new Product
{
Id = ,
Desc = "牛奶面包",
Price =
};
var orderItem3 = new OrderItem
{
Order = order,
Product = product,
Count =
};
context.OrderItems.Add(orderItem1);
context.OrderItems.Add(orderItem2);
context.OrderItems.Add(orderItem3);
context.SaveChanges();
} //遍历
using (var context = new EF6RecipeEntities())
{
foreach (var order in context.Orders)
{
Console.WriteLine("订单编号:{0},下单日期:{1},订单详情如下:",order.Id,order.OrderDate.ToShortDateString());
foreach (var oi in order.OrderItem)
{
Console.WriteLine("产品Id:{0},产品描述:{1},产品数量:{2},产品价格:{3}", oi.Product.Id,oi.Product.Desc,oi.Count,oi.Product.Price);
}
Console.WriteLine();
}
}
Console.ReadKey();

七、关于使用多对多有载荷还是多对多无载荷的意见

如果你有一个无载荷的多对多关系时,你可以考虑通过增加一标识列将其改变为有载荷的多对多关系。当你导入表到你的模型时,你将得到两个包含一对多关系的实体,这意味着,你的代码为将来有可能出现的多载荷做好了准备。增加一整型标识列的代价通常很小,但给模型带来了更大的灵活性。

EF基础知识小记五(一对多、多对多处理)的更多相关文章

  1. EF基础知识小记四(数据库=>模型设计器)

    EF基础知识小记三(设计器=>数据库)介绍了如何创建一个空设计器模型,并如何将模型同步到数据库的表中,本文则主要介绍如何将一个存在的数据库同步到模型设计器中.为了能快速的模拟这个过程,给出一下建 ...

  2. EF基础知识小记七(拆分实体到多个表以及拆分表到多个实体)

    一.拆分实体到多个表 1.在日常开发中,会经常碰到一些老系统,当客户提出一些新的需求,这些需求需要在原来的表的基础上加一些字段,大多数人会选择通过给原表添加字段的方式来完成这些需求,方法,虽然可行,但 ...

  3. EF基础知识小记六(使用Code First建模自引用关系,常用于系统菜单、文件目录等有层级之分的实体)

    日常开发中,经常会碰到一些自引用的实体,比如系统菜单.目录实体,这类实体往往自己引用自己,所以我们必须学会使用Code First来建立这一类的模型. 以下是自引用表的数据库关系图: ok,下面开始介 ...

  4. EF基础知识小记三(设计器=>数据库)

    本文主要介绍通过EF的设计器来同步数据库和对应的实体类.并使用生成的实体上下文,来进行简单的增删查该操作 1.通过EF设计器创建一个简单模型 (1).右键目标项目添加新建项 (2).选择ADO.Net ...

  5. EF基础知识小记二

    1.EF的常用使用场景 (1).维护一个已经存在的数据库,VS提供了工具帮助我们把数据库中的表和视图等对象导入到实体框架.        [数据库=>模型(Database First)] (2 ...

  6. EF基础知识小记一

    1.EF等ORM解决方案出现的原因 因为软件开发中分析和解决问题的方法已经接近成熟,然后关系型数据库却没有,很多年来,数据依然是保存在表行列这样的模式里,所以,在面相对象和高度标准化的数据库中产生了一 ...

  7. Linq基础知识小记四之操作EF

    1.EF简介 EF之于Linq,EF是一种包含Linq功能对象关系映射技术.EF对数据库架构和我们查询的类型进行更好的解耦,使用EF,我们查询的对象不再是C#类,而是更高层的抽象:Entity Dat ...

  8. IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列

    1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...

  9. Python基础知识(五)

    # -*- coding: utf-8 -*-# @Time : 2018-12-25 19:31# @Author : 三斤春药# @Email : zhou_wanchun@qq.com# @Fi ...

随机推荐

  1. Netty学习第四节WebSocket入门

    1.什么是webSocket?       webSocket是H5提出的一个协议规范,webSocket约定了一个通信的规范,通过一个握手的机制,客户端和服务端,就能建立一个类似TCP的连接,从而方 ...

  2. CentOS7+Nginx+多个Tomcat配置

    转载自:https://blog.csdn.net/name_chc/article/details/73332272:亲测可用,加了一些注释: 配置多个tomcat转发 另附上tomcat启动慢的解 ...

  3. python调用dll方法

    在python中调用dll文件中的接口比较简单,实例代码如下: 如我们有一个test.dll文件,内部定义如下: extern "C"{ int __stdcall test( v ...

  4. 解决火狐浏览器发送jquery的ajax请求无效的问题

    今天遇到这样一个问题: 页面在chrome下发送ajax的请求是没有问题的,但是在firfox下无效. 代码大致如下: //前面省略 <form> ..... <button cla ...

  5. 基于MATLAB的均值滤波算法实现

    在图像采集和生成中会不可避免的引入噪声,图像噪声是指存在于图像数据中的不必要的或多余的干扰信息,这对我们对图像信息的提取造成干扰,所以要进行去噪声处理,常见的去除噪声的方法有均值滤波.中值滤波.高斯滤 ...

  6. hdu 4952 暴力

    http://acm.hdu.edu.cn/showproblem.php?pid=4952 给定x,k,i从1到k,每次a[i]要是i的倍数,并且a[i]大于等于a[i-1],x为a0 递推到下一个 ...

  7. Bellman_ford货币兑换——正权回路判断

    POJ1860 题目大意:你在某一点有一些钱,给定你两点之间钱得兑换规则,问你有没有办法使你手里的钱增多.就是想看看转一圈我的钱能不能增多,出现这一点得条件就是有兑换钱得正权回路,所以选择用bellm ...

  8. 为MAC配置终端环境iTerm2+Zsh+oh-my-zsh

    首先展示下我的终端吧. 这就是我们为什么要配置iTerm2+Zsh+oh-my-zsh环境的原因: 我们使用zsh解释器,当然等你使用 zsh时就会知道zsh与bash对比的强大之处了. 至于我们的g ...

  9. [翻译]第一天 - 在 Windows 下安装和运行 .NET Core

    原文: http://michaelcrump.net/getting-started-with-aspnetcore/ 免责声明:我不是 .NET Core 开发团队的一员,并且使用的是公开.可用的 ...

  10. NLayerAppV3-Distributed Service Layer(分布式服务层)

    回顾:NLayerAppV3是一个使用.net 2.1实现的经典DDD的分层架构的项目. NLayerAppV3是在NLayerAppV2的基础上,使用.net core2.1进行重新构建的:它包含了 ...