Entity Framework管理实体关系(二):管理一对二关系
在上一篇文章中,简单的介绍了使用Fluent API如何管理一对一的实体关系,在这篇文章中,接着介绍Fluent API如何管理一对多的实体关系。
要在数据库中配置一对多关系,我们可以依赖EF约定,还可以使用数据注解或Fluent API来显式创建关系。接下来使用捐赠者Donator和支付方法PayWay这两个类来举例子,这里的一对多关系是:一个人可以通过多种支付方式赞助我。

支付方式类PayWay结构如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace OneToMany.Model.Model
{
public class PayWay
{
public int PayWayId { get; set; } public string Name { get; set; } public virtual Donator Donator { get; set; }
}
}
因为一个赞助者可以通过多种支付方式赞助我,这句话就表明了Donator对象应该有一个PayWay的集合,因此,我们要给Donator类新加入一个集合属性,捐赠者类Donator结构如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace OneToMany.Model.Model
{
public class Donator
{
public int Id { get; set; } public string Name { get; set; } public string Amount { get; set; } public DateTime DonateDate { get; set; } /// <summary>
/// PayWay类型的集合属性
/// </summary>
public virtual ICollection<PayWay> PayWays { get; set; }
}
}
Donator类的配置伙伴类的定义如下:
using OneToMany.Model.Model;
using System;
using System.Collections.Generic;
using System.Data.Entity.ModelConfiguration;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace OneToMany.Map.Map
{
public class DonatorMap :EntityTypeConfiguration<Donator>
{
public DonatorMap()
{
ToTable("Donator");
//将Name设置为必须
this.Property(p => p.Name).IsRequired();
} }
}
PayWay的配置伙伴类的定义如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OneToMany.Model.Model;
using System.Data.Entity.ModelConfiguration; namespace OneToMany.Map.Map
{
public class PayWayMap : EntityTypeConfiguration<PayWay>
{
public PayWayMap()
{
ToTable("PayWay");
this.Property(p => p.Name).HasMaxLength();
}
}
}
EFDbContext类定义如下:
using OneToMany.Model.Model;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace OneToMany.Map.EFContext
{
public class EFDbContext:DbContext
{
public EFDbContext()
: base("name=CodeFirstApplication")
{ } public DbSet<PayWay> PayWays { get; set; }
public DbSet<Donator> Donators { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// 设置主键
modelBuilder.Entity<PayWay>().HasKey(p => p.PayWayId);
modelBuilder.Entity<Donator>().HasKey(p => p.DonatorId);
// 设置一对多
modelBuilder.Entity<Donator>().HasMany(p => p.PayWays).WithRequired(t => t.Donator);
base.OnModelCreating(modelBuilder);
}
}
}
控制台程序定义如下:
using OneToMany.Map.EFContext;
using OneToMany.Model.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace OneToManyApplication
{
class Program
{
static void Main(string[] args)
{
using (var context = new EFDbContext())
{
var donator = new Donator
{
Amount = ,
Name = "虾米",
DonateDate = DateTime.Now,
PayWays = new List<PayWay> {
new PayWay{Name="支付宝"},
new PayWay{Name="微信"} }
};
context.Donators.Add(donator);
context.SaveChanges();
} Console.WriteLine("执行成功");
Console.ReadKey();
}
}
}
程序运行后数据库结构如下:

查询数据:

Entity Framework管理实体关系(二):管理一对二关系的更多相关文章
- Entity Framework对同一张表配置一对多关系
在实际的项目开发中,可能会遇到同一张表同时保存自身和上级(或下级)的信息(一般是通过设置一个上级主键[ParentId]的列与主键[Id]关系) 例如:城市库,有国家.省.市...,省的ParentI ...
- [转]Entity Framework 的实体关系
通过 Entiy Framework实践系列 文章,理了理 Entity Framework 的实体关系. 为什么要写文章来理清这些关系?“血”的教训啊,刚开始使用 Entity Framework ...
- Entity Framework关联实体的三种加载方法
推荐文章 EF性能之关联加载 总结很好 一:介绍三种加载方式 Entity Framework作为一个优秀的ORM框架,它使得操作数据库就像操作内存中的数据一样,但是这种抽象是有性能代价的,故鱼和熊掌 ...
- Entity Framework - 基于外键关联的单向一对一关系
代码的世界,原以为世界关系很简单,确道是关系无处不在.NET世界里ORM框架中EntityFramework作为其中翘楚,大大解放了搬砖工作的重复工作,着实提高了不少生产力,而也碰到过不少问题!比如关 ...
- Entity Framework(实体框架 EF)
什么是Entity Framework呢(下面简称EF)? EF(实体框架)是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架.ORM(对象关系映射框架):指的是面向 ...
- Entity Framework 6 实体某些字段根据模型状态进行自动更新内容
1.定义基础实体对象 public class BaseEntity { public int Id { get; set; } public DateTime? CreateTime { get; ...
- Entity Framework 新增实体,新增抽象实体
抽象实体不能new 抽象类:人,实体类:学生 人 p_人= new 学生(); 添加数据,学生和人都添加 抽象类可以提供一个抽象的方法,但是并没有实现,类似接口,但又不同于接口.子类继承父类时必须 ...
- 【极力分享】[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例【转载自https://segmentfault.com/a/1190000004152660】
[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例 本文我们来学习一下在Entity Framework中使用Cont ...
- [C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例
本文我们来学习一下在Entity Framework中使用Context删除多对多关系的实体是如何来实现的.我们将以一个具体的控制台小实例来了解和学习整个实现Entity Framework 多对多关 ...
- Entity Framework 实体关系总结
刚开始使用 Entity Framework 的时候,由于没有静下心来认真理清关系,走了一些"痛不欲生"的弯路.而我们目前开发的项目都在使用 Entity Framework,为了 ...
随机推荐
- 【LeetCode】27. Remove Element (2 solutions)
Remove Element Given an array and a value, remove all instances of that value in place and return th ...
- Python练习笔记——计算个人体重指数
输入您的身高 体重 性别 计算出你的体重是否标准 gender = input('请输入您的性别(boy or girl):') height = input('请输入您的身高(单位cm):') he ...
- Unix环境高级编程(十二)线程控制
本章介绍了一个进程中多个线程之间如何保持数据的似有性及进程的系统调用如何与线程进行交互. 1.线程限制: Single Unix定义了一线线程操作的限制,和其他的限制一样,可以通过sysconf来查询 ...
- 关闭VS的实时调试器
今天要安装一个水晶报表.安装过程有几个文件有错误.结果这个vs的实时调试器老是调出来.而且还是5次跳出来等你取消5次之后,才到默认的忽略的界面.你知道有多烦的,还得看这他,点完一次还要等几秒钟.差点崩 ...
- 通向码农的道路(enet开源翻译计划 二)
QQ 324186207群 enet交流技术,主要是为了研究tcp内部执行机制.欢迎大家增加探讨.小弟水平有限,翻译难免有误. . http://enet.bespin.org 解析enet 双向链表 ...
- (LeetCode)旋转数组
原体描写叙述例如以下: Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3 ...
- PHP笔试题
1.不用新变量直接交换现有两个变量的值 (1)list($a,$b)=array($b,$a); (2)a=a+b,b=a-b,a=a-b 2.PHP数字金额转大小格式,同时说明思路 function ...
- vim:修改光标的显示
我比较习惯vim下光标显示为一条竖线,这样的好处是可以准确的知道光标的位置.但有的时候光标表现为一个方块.这个是可以修改改地. 终端下: 终端下这个和终端的光标设置有关,只要修改了终端中光标的显示,v ...
- jvm 性能调优 经验总结---转
最近因项目存在内存泄漏,故进行大规模的JVM性能调优 , 现把经验做一记录. 一.JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老 ...
- <实战> 通过分析Heap Dump 来了解 Memory Leak ,Retained Heap,Shallow Heap
引入: 最近在和别的团队的技术人员聊天,发现很多人对于堆的基本知识都不太熟悉,所以他们不能很好的检测出memory leak问题,这里就用一个专题来讲解如何通过分析heap dump文件来查找memo ...