在上一篇文章中,简单的介绍了使用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管理实体关系(二):管理一对二关系的更多相关文章

  1. Entity Framework对同一张表配置一对多关系

    在实际的项目开发中,可能会遇到同一张表同时保存自身和上级(或下级)的信息(一般是通过设置一个上级主键[ParentId]的列与主键[Id]关系) 例如:城市库,有国家.省.市...,省的ParentI ...

  2. [转]Entity Framework 的实体关系

    通过 Entiy Framework实践系列 文章,理了理 Entity Framework 的实体关系. 为什么要写文章来理清这些关系?“血”的教训啊,刚开始使用 Entity Framework  ...

  3. Entity Framework关联实体的三种加载方法

    推荐文章 EF性能之关联加载 总结很好 一:介绍三种加载方式 Entity Framework作为一个优秀的ORM框架,它使得操作数据库就像操作内存中的数据一样,但是这种抽象是有性能代价的,故鱼和熊掌 ...

  4. Entity Framework - 基于外键关联的单向一对一关系

    代码的世界,原以为世界关系很简单,确道是关系无处不在.NET世界里ORM框架中EntityFramework作为其中翘楚,大大解放了搬砖工作的重复工作,着实提高了不少生产力,而也碰到过不少问题!比如关 ...

  5. Entity Framework(实体框架 EF)

    什么是Entity Framework呢(下面简称EF)? EF(实体框架)是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架.ORM(对象关系映射框架):指的是面向 ...

  6. Entity Framework 6 实体某些字段根据模型状态进行自动更新内容

    1.定义基础实体对象 public class BaseEntity { public int Id { get; set; } public DateTime? CreateTime { get; ...

  7. Entity Framework 新增实体,新增抽象实体

    抽象实体不能new 抽象类:人,实体类:学生 人 p_人= new 学生();   添加数据,学生和人都添加 抽象类可以提供一个抽象的方法,但是并没有实现,类似接口,但又不同于接口.子类继承父类时必须 ...

  8. 【极力分享】[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例【转载自https://segmentfault.com/a/1190000004152660】

      [C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例 本文我们来学习一下在Entity Framework中使用Cont ...

  9. [C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例

    本文我们来学习一下在Entity Framework中使用Context删除多对多关系的实体是如何来实现的.我们将以一个具体的控制台小实例来了解和学习整个实现Entity Framework 多对多关 ...

  10. Entity Framework 实体关系总结

    刚开始使用 Entity Framework 的时候,由于没有静下心来认真理清关系,走了一些"痛不欲生"的弯路.而我们目前开发的项目都在使用 Entity Framework,为了 ...

随机推荐

  1. 【LeetCode】80. Remove Duplicates from Sorted Array II (2 solutions)

    Remove Duplicates from Sorted Array II Follow up for "Remove Duplicates":What if duplicate ...

  2. ubuntu(14.4) 安装phpmyadmin

    1.下载phpmyadmin文件,然后上传到www目录下,直接通过ip地址进行访问,然后输入mysql账号就可以登录了

  3. .net mvc前台如何接收和解析后台的字典类型的数据 二分搜索算法 window.onunload中使用HTTP请求 网页关闭 OpenCvSharp尝试 简单爬虫

    .net mvc前台如何接收和解析后台的字典类型的数据   很久没有写博客了,最近做了一个公司门户网站的小项目,其中接触到了一些我不会的知识点,今日事情少,便记录一下,当时想在网上搜索相关的内容,但是 ...

  4. Response.Flush() Response.End()的区别

    //Response.Flush() 将缓存中的内容立即显示出来//Response.End()  缓冲的输出发送到客户端  停止页面执行//例://Response.Write("520& ...

  5. Python abs() 函数

    描述 abs() 函数返回数字的绝对值. 语法 以下是 abs() 方法的语法: abs( x ) 参数 x -- 数值表达式,可以是整数,浮点数,复数. 返回值 函数返回 x(数字)的绝对值,如果参 ...

  6. tomcat6的编译和导入myeclipse

    声明:近期在学习tomcat6的源代码,网上搜索了些相关的资料,并自己操作了下进行了对应的汇总.如今总结例如以下 本文目的:编译tomcat6源代码+导入tomcat6源代码到myeclipse 測试 ...

  7. mysql-5.7 group commit 详解

    一.mysql group commit 的官方定义: InnoDB, like any other ACID-compliant database engine, flushes the redo ...

  8. vim-snipmate的c.snippets(2016.7.10)

    ## Main # main snippet main int main ( void ) { ${} ; } ##include snippet inc #include <${:stdio} ...

  9. 服务器swap

    交换区(swap)是存在于高速存储设 备上的一块区域,是虚拟内存系统重要的组成部分.通过交换区,我们不再局限于有限的物理内存空间,理论上可以无限地扩大虚拟内存系统,从而运行更多的程 序,进行更多的业务 ...

  10. Oracle PLSQL Demo - 12.定义包体[Define PACKAGE BODY]

    CREATE OR REPLACE PACKAGE BODY temp_package_demo is FUNCTION f_demo(userid NUMBER) RETURN BOOLEAN IS ...