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(16);
        }
    }
}

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 = 6,
                    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管理一对二实体关系的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Entity Framework实体拆分多个表

    一.概念 实体拆分:一个实体拆分成多个表,如Product实体,可以拆分成Product和ProductWebInfo两个表,Product表用于存储商品的字符类信息,ProductWebInfo用于存储商品的图片信息,两张表通过SKU进行关联. 1.Product实体类结构: using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Comp

  • Entity Framework表拆分为多个实体

    概念 表拆分:一个表拆分成多个实体,例如Photograph表,可以拆分为Photograph和PhotographFullImage两张表. 1.Photograph实体结构: using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Li

  • Entity Framework管理一对一实体关系

    我们现在已经知道如何使用Code First来定义简单的领域类,并且如何使用DbContext类来执行数据库操作.现在我们来看下数据库理论中的多样性关系,我们会使用Code First来实现下面的几种关系: 1.一对一关系: one to one 2.一对多关系: one to many 3.多对多关系::many to many 首先要明确关系的概念.关系就是定义两个或多个对象之间是如何关联的.它是由关系两端的多样性值识别的,比如,一对多意味着在关系的一端,只有一个实体,我们有时称为父母:在关

  • Entity Framework管理一对二实体关系

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

  • Entity Framework模型优先与实体对象查询

    目录 一.概念: 1.EF6 可实现的功能: 二.安装Entity Framework6 1.VS2019 Installer安装“Entity Framework6 工具” 2.通过Nuget安装“Entity Framework”: 三.新建ObjectContext 和EntityObject 1.“根据模型生成的数据库”的设计器功能实现ModelFirst. 四.实体对象查询:linq to Entities 1.使用lambda表达式查询 2.执行存储过程(通过“添加”-----”函数

  • Entity Framework管理并发

    理解并发 并发管理解决的是允许多个实体同时更新,实际上这意味着允许多个用户同时在相同的数据上执行多个数据库操作.并发是在一个数据库上管理多个操作的一种方式,同时遵守了数据库操作的ACID属性(原子性.一致性.隔离性和持久性). 想象一下下面几种可能发生并发的场景: 1.用户甲和乙都尝试修改相同的实体. 2.用户甲和乙都尝试删除相同的实体. 3.用户甲正在尝试修改一个实体时,用户乙已经删除了该实体. 4.用户甲已经请求读取一个实体,用户乙读完该实体之后更新了它. 这些场景可能会潜在地产生错误的数据

  • Entity Framework使用LINQ操作实体

    一.什么是LINQ TO Entities LINQ,全称是Language-INtegrated Query(集成语言查询),是.NET语言中查询数据的一种技术.LINQ to Entities是一种机制,它促进了使用LINQ对概念模型的查询. 因为LINQ是声明式语言,它让我们聚焦于我们需要什么数据而不是应该如何检索数据.LINQ to Entities在实体数据模型之上提供了一个很好的抽象,所以我们可以使用LINQ来指定检索什么数据,然后LINQ to Entities provider会

  • Entity Framework使用Code First的实体继承模式

    目录 一.TPT继承模式 1.Person类 2.使用数据迁移创建数据库 3.填充数据 二.TPH模式 1.创建有继承关系的实体类 2.创建数据上下文 3.使用数据迁移创建数据库 4.不使用默认生成的区别多张表的类型 5.填充数据 6.查询数据 三.TPC模式 1.创建实体类 2.配置数据上下文 3.使用数据迁移生成数据库 4.填充数据 Entity Framework的Code First模式有三种实体继承模式 1.Table per Type (TPT)继承 2.Table per Clas

  • Entity Framework使用Code First模式管理视图

    一.什么是视图 视图在RDBMS(关系型数据库管理系统)中扮演了一个重要的角色,它是将多个表的数据联结成一种看起来像是一张表的结构,但是没有提供持久化.因此,可以将视图看成是一个原生表数据顶层的一个抽象.例如,我们可以使用视图提供不同安全的级别,也可以简化必须编写的查询,尤其是我们可以在代码中的多个地方频繁地访问使用视图定义的数据.EF Code First模式现在还不完全支持视图,因此我们必须使用一种变通的方法.这种方法是:将视图真正看成是一张表,让EF定义这张表,然后在删除它,最后再创建一个

  • Entity Framework使用Code First模式管理存储过程

    在EF中使用存储过程和使用视图是很相似的,一般会使用Database对象上的两个方法:SqlQuery和ExecuteSqlCommand.为了从存储过程中读取很多数据行,我们只需要定义一个类,我们会将检索到的所有数据行物质化到该类实例的集合中.比如,从下面的存储过程读取数据: CREATE PROCEDURE [dbo].[SelectBooks] @BookTypeName AS NVARCHAR(10) AS BEGIN select B.Name,B.Author,B.Publicati

  • Entity Framework使用Code First模式管理事务

    一.什么是事务 处理以数据为中心的应用时,另一个重要的话题是事务管理.ADO.NET为事务管理提供了一个非常干净和有效的API.因为EF运行在ADO.NET之上,所以EF可以使用ADO.NET的事务管理功能. 当从数据库角度谈论事务时,它意味着一系列操作被当作一个不可分割的操作.所有的操作要么全部成功,要么全部失败.事务的概念是一个可靠的工作单元,事务中的所有数据库操作应该被看作是一个工作单元. 从应用程序的角度来看,如果我们有多个数据库操作被当作一个工作单元,那么应该将这些操作包裹在一个事务中

  • Entity Framework配置关系

    目录 一.Has方法与With方法 1.Has方法: 2.With方法: 二.一对一关系: 1.DataAnnotations数据标注的方式 2.Fluent API方式 (1)1:0..1关系 (2)1:1 关系 三.一对多关系: 1.DataAnnotations方式 2.更改外键的nullable属性和外键的名字 1.使用Data Annotations指定外键: 2.用Fluent API指定外键: 3.对同一实体多个引用的情况 4.级联删除 四.多对多关系 指定表名 一.Has方法与W

随机推荐