【EF Code First】 一对一、一对多的多重关系配置
这里使用相册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】 一对一、一对多的多重关系配置的更多相关文章
- 【EF Code First】 一对多、多对多的多重关系配置
这里使用用户表(User)和项目(Project)表做示例 有这样一个需求: 用户与项目的关系是:一个用户可以发多个项目,可以参加多个项目,而项目可以有多个参与成员和一个发布者 [其中含1-n和n-n ...
- EF Code First一对一、一对多、多对多关联关系配置
1.EF Code First一对一关联关系 项目结构图: 实体类: Account.cs using System; using System.Collections.Generic; using ...
- EntityFrameworkCore 一对一 && 一对多 && 多对多配置
基本数据结构 表设计如下: 入学记录 public class AdmissionRecord { [Key] public long Id { get; set; } public DateTime ...
- EF Code First中的主外键约定和一对一、一对多关系的实现
对于主外键约定的理解,其实是学习实体间一对一和一对多关系的基础. 1.1 主键(Key)约定 主键的默认约定是:只要字段名为--实体名(类名)+"id"(不区分大小写),这就算是默 ...
- EF Code First 一对多、多对多关联,如何加载子集合?
应用场景 先简单描述一下标题的意思:使用 EF Code First 映射配置 Entity 之间的关系,可能是一对多关系,也可能是多对多关系,那如何加载 Entity 下关联的 ICollectio ...
- EF Code First学习系列
EF Model First在实际工作中基本用不到,前段时间学了一下,大概的了解一下.现在开始学习Code First这种方式.这也是在实际工作中用到最多的方式. 下面先给出一些目录: 1.什么是Co ...
- EF和MVC系列文章导航:EF Code First、DbContext、MVC
对于之前一直使用webForm服务器控件.手写ado.net操作数据库的同学,突然来了EF和MVC,好多新概念泉涌而出,的确犹如当头一棒不知所措.本系列文章可以帮助新手入门并熟练使用EF和MVC,有了 ...
- EF Code First 初体验
Code First 顾名思义就是先代码,再由代码生成数据库的开发方式. 废话不多说,直接来一发看看:在VS2010里新建一个空白解决方案,再依次添加两个类库项目:Model.DataAccess和一 ...
- 1.什么是Code First(EF Code First 系列)
EF4.1中开始支持Code First .这种方式在领域设计模式中非常有用.使用Code First模式,你可以专注于领域设计,根据需要,为你一个领域的对象创建类集合,而不是首先来设计数据库,然后来 ...
随机推荐
- 图的最短路算法 Bellman-Ford
BF求图的最短路径的时间复杂度是O(MN),这样的时间复杂度并不比迪杰斯特拉算法好,但是BF算法支持图中存在负权的情况,但图中不能存在负圈,因为如果存在负圈,最短路是不存在的,因此BF算法的另一个重要 ...
- Git 使用及原理 总结
1. $git diff origin/master master (show me the changes between the remote master branch and my mast ...
- com学习 2015-10-16
Com对象类似于C++类对象的概念, interface IX { virtral void fx()=0: } class CA:IX { virtual fx(){ printf("he ...
- C#之泛型
泛型是C# 2.0版本才有的语言特性,是具有参数类型占位符的类.结构.接口和方法.这些占位符是类.结构.接口和方法所存储或使用的一个或多个占位符.简单来说,就是变量类型的参数化. 以下是详细demo: ...
- biji001
指针对变量使对指向变量的指针&运算符产生,对指针使用*运算符则可以返回到原始变量只要p指向i,那么*p就是i的别名*p不仅仅拥有和i同样的值,而且对*p的改变i的值*p左值,对它赋值合法*p ...
- DataGridview焦点不移开不保存数据问题
this.datagridLeft.ClearSelection(); this.datagridLeft.Refresh(); this. ...
- 用python3统计代码行数
今天接到一个电话面试,对方问我在一个项目中维护了多少行代码. 我懵逼了,从来没有统计过啊,怎么还会有这种需求? 当时一脸茫然的想了想,回答了一个,呃...差不多两千多行吧...感觉很心虚 挂完电话之后 ...
- (笔记)angular 路由
- 移动端的头部标签和meta
<!DOCTYPE html><!--HTML5 doctype--> <html> <head> <title>xxx</title ...
- DropDownList的用法
DropDownList是一个下拉列表菜单,平时我们也会经常用到,下面就来看看如何绑定值 1> 静态添加,就是说在值都很明确的情况下 ListItem list1 = new ListI ...