这里使用相册Album和图片Picture的关系做示例

1,Album与Picture最基本的关系是1-n(一个相册可以有多张图片)

这时Album、Picture实体类可以这么定义

   /// <summary>
/// 相册
/// </summary>
public class Album
{
public int ID { get; set; }
/// <summary>
/// 标题
/// </summary>
public string Title { get; set; }
public DateTime CreateTime { get; set; }
/// <summary>
/// 拥有者
/// </summary>
public virtual User Owner { get; set; }
}

  

/// <summary>
/// 图片
/// </summary>
public class Picture
{
public long ID { get; set; } public string Title { get; set; } public string Uri { get; set; } public DateTime CreateTime { get; set; } /// <summary>
/// 所属相册
/// </summary>
public virtual Album Album { get; set; }
}

生成的表结构

2,后来就要改需求了,相册要加一个封面

于是Album与Picture的关系就加了一个1-1(一个相册只有一个封面)

这样就需要配置一下实体关系来区分属性之间的关系

Album和Picture类做一些修改

/// <summary>
/// 相册
/// </summary>
public class Album
{
public int ID { get; set; }
/// <summary>
/// 标题
/// </summary>
public string Title { get; set; }
public DateTime CreateTime { get; set; }
/// <summary>
/// 拥有者
/// </summary>
public virtual User Owner { get; set; }
/// <summary>
/// 封面
/// </summary>
public virtual Picture Cover { get; set; }
/// <summary>
/// 相册下的图片列表
/// </summary>
public virtual ICollection<Picture> Pictures { get; set; }
}

  

 /// <summary>
/// 图片
/// </summary>
public class Picture
{
public long ID { get; set; } public string Title { get; set; } public string Uri { get; set; } public DateTime CreateTime { get; set; } /// <summary>
/// 所属相册
/// </summary>
public virtual Album Album { get; set; }
}

然后添加一个映射类

 public class AlbumMap:EntityTypeConfiguration<Album>
{
public AlbumMap() {
this.HasMany<Picture>(a => a.Pictures).WithRequired(p=>p.Album);
}
}

EF上下文类中重写方法

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();//移除复数表名的契约
modelBuilder.Configurations.Add(new AlbumMap());
}

数据库迁移时生成的代码:

 public partial class AlbumAddCover : DbMigration
{
public override void Up()
{
DropForeignKey("dbo.Picture", "Album_ID", "dbo.Album");
DropIndex("dbo.Picture", new[] { "Album_ID" });
AddColumn("dbo.Album", "Cover_ID", c => c.Long());
AlterColumn("dbo.Picture", "Album_ID", c => c.Int(nullable: false));
CreateIndex("dbo.Album", "Cover_ID");
CreateIndex("dbo.Picture", "Album_ID");
AddForeignKey("dbo.Album", "Cover_ID", "dbo.Picture", "ID");
AddForeignKey("dbo.Picture", "Album_ID", "dbo.Album", "ID", cascadeDelete: true);
} public override void Down()
{
DropForeignKey("dbo.Picture", "Album_ID", "dbo.Album");
DropForeignKey("dbo.Album", "Cover_ID", "dbo.Picture");
DropIndex("dbo.Picture", new[] { "Album_ID" });
DropIndex("dbo.Album", new[] { "Cover_ID" });
AlterColumn("dbo.Picture", "Album_ID", c => c.Int());
DropColumn("dbo.Album", "Cover_ID");
CreateIndex("dbo.Picture", "Album_ID");
AddForeignKey("dbo.Picture", "Album_ID", "dbo.Album", "ID");
}
}

最终表结构

上一节:【EF Code First】 一对多、多对多的多重关系配置

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

【EF Code First】 一对一、一对多的多重关系配置的更多相关文章

  1. 【EF Code First】 一对多、多对多的多重关系配置

    这里使用用户表(User)和项目(Project)表做示例 有这样一个需求: 用户与项目的关系是:一个用户可以发多个项目,可以参加多个项目,而项目可以有多个参与成员和一个发布者 [其中含1-n和n-n ...

  2. EF Code First一对一、一对多、多对多关联关系配置

    1.EF Code First一对一关联关系 项目结构图: 实体类: Account.cs using System; using System.Collections.Generic; using ...

  3. EntityFrameworkCore 一对一 && 一对多 && 多对多配置

    基本数据结构 表设计如下: 入学记录 public class AdmissionRecord { [Key] public long Id { get; set; } public DateTime ...

  4. EF Code First中的主外键约定和一对一、一对多关系的实现

    对于主外键约定的理解,其实是学习实体间一对一和一对多关系的基础. 1.1 主键(Key)约定 主键的默认约定是:只要字段名为--实体名(类名)+"id"(不区分大小写),这就算是默 ...

  5. EF Code First 一对多、多对多关联,如何加载子集合?

    应用场景 先简单描述一下标题的意思:使用 EF Code First 映射配置 Entity 之间的关系,可能是一对多关系,也可能是多对多关系,那如何加载 Entity 下关联的 ICollectio ...

  6. EF Code First学习系列

    EF Model First在实际工作中基本用不到,前段时间学了一下,大概的了解一下.现在开始学习Code First这种方式.这也是在实际工作中用到最多的方式. 下面先给出一些目录: 1.什么是Co ...

  7. EF和MVC系列文章导航:EF Code First、DbContext、MVC

    对于之前一直使用webForm服务器控件.手写ado.net操作数据库的同学,突然来了EF和MVC,好多新概念泉涌而出,的确犹如当头一棒不知所措.本系列文章可以帮助新手入门并熟练使用EF和MVC,有了 ...

  8. EF Code First 初体验

    Code First 顾名思义就是先代码,再由代码生成数据库的开发方式. 废话不多说,直接来一发看看:在VS2010里新建一个空白解决方案,再依次添加两个类库项目:Model.DataAccess和一 ...

  9. 1.什么是Code First(EF Code First 系列)

    EF4.1中开始支持Code First .这种方式在领域设计模式中非常有用.使用Code First模式,你可以专注于领域设计,根据需要,为你一个领域的对象创建类集合,而不是首先来设计数据库,然后来 ...

随机推荐

  1. 华为OJ平台——计算字符串的相似度

    题目描述: 对于不同的字符串,我们希望能有办法判断相似程度,我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法如下: 1 修改一个字符,如把“a”替换为“b”. 2 增加一个字符,如 ...

  2. PfSense基于BSD的软件防火墙的安装、配置与应用

    PfSense基于BSD的软件防火墙的安装.配置与应用 PfSense是一个FreeBSD下的免费开源的防火墙和路由器软件,他为了在X86平台上面建立一个高集成性的防火墙项目,下面就为大家展示如何配置 ...

  3. sql语句小练习一

    create database aaa go use aaa go create table student(    sno varchar(3), sname varchar(4) not null ...

  4. 2.1Android底层开发需要哪些工具

    开发.测试和调试Linux驱动.HAL程序库需要的工具: (1)JDK6或以上版本: (2)Eclipse3.4或以上版本: (3)ADT(用于开发Android应用程序): (4)CDT(用于开发A ...

  5. SQLite开发工具

    Sqlite 管理工具 SQLiteDeveloper及破解 功能特点 表结构设计,数据维护,ddl生成,加密数据库支持,sqlite2,3支持 唯一缺憾,收费,有试用期 下载地址: http://w ...

  6. TortoiseGit和Git操作git@osc简要说明

    之前搞过一次git@osc的操作,重装系统后今天准备再次提交代码,悲剧了,我忘了之前怎么干得了,再次百度以后,终于搞定了,准备写下来,省得下次再忘了. 1.首先生成key,使用下面的工具,在Torto ...

  7. MongoDB 创建数据库

    语法 MongoDB 创建数据库的语法格式如下: use DATABASE_NAME 如果数据库不存在,则创建数据库,否则切换到指定数据库. 实例 以下实例我们创建了数据库 runoob: > ...

  8. ThinkPHP实现联动菜单;

    联动菜单,首先给你看看前端是怎么写的:

  9. Enum枚举类型的使用笔记

    好处: 1.可以直接使用switch 2.可以实现toString()方法 笔记: 1.枚举类头部定义的成员变量,可以看做是枚举类的一个实例 public enum Color { RED(" ...

  10. 设计师眼中功能强大的Xcode

    作为设计师,不仅要能创造出移动为先的新产品,更要了解能创造出优秀移动作品的工具.这个实现过程可以让我们的设计更加优秀. 过去两个月,我每天在 Xcode 上花费的时间大约有 10 个小时,我学到了很多 ...