EntityFrameWork Code First 多对多关系处理
场景2: 一个文章类别(Category)下含有多篇文章(Article),而文章也可能对应多个类别

Article和Category的代码更改如下:
/// <summary>
/// 文章信息
/// </summary>
public class Article:ModelBase
{
/// <summary>
/// 类别名字
/// </summary>
public string Name { get; set; } public ICollection<Category> Categorys { get; set; }
}
public class Category : ModelBase
{
/// <summary>
/// 类别名字
/// </summary>
public string Name { get; set; } public ICollection<Article> Articles { get; set; }
}
然后在Entity Framework的OnModelCreating中通过Fluent API定义“多对多”关系
如下配置会在数据库生成一张叫ArticleCategory的表属性分别为ArticleID和CategoryID
public class CmsDbContext : DbContextBase
{
public CmsDbContext():base(CachedConfigContext.Current.DaoConfig.Cms,new LogDbContext()) { }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer<CmsDbContext>(null);
modelBuilder.Entity<Article>().HasMany(a => a.Categorys)
.WithMany(c => c.Articles)
.Map(u =>
{
u.MapLeftKey("ArticleID");
u.MapRightKey("CategoryID");
u.ToTable("ArticleCategory"); });
base.OnModelCreating(modelBuilder);
} public DbSet<Category> Categorys { get; set; }
public DbSet<Article> Articles { get; set; } }
分别编写两个场景来测试以下结果:
public interface ICmsService
{
//通过文章id获取文章同时加载该文章所有类别信息
Article GetArticle(int articleId);
//通过类别id获取类别同时加载该类别下所有文章
Category GetCategory(int categoryId);
}
接口实现类:
public class CmsService : ICmsService
{
public Article GetArticle(int articleId)
{
using (var dbContext = new CmsDbContext())
{
return dbContext.Articles.Include("Categorys").FirstOrDefault(a => a.ID == articleId);
}
} public Category GetCategory(int categoryId)
{
using (var dbContext = new CmsDbContext())
{
return dbContext.Categorys.Include("Articles").FirstOrDefault(c => c.ID == categoryId);
}
}
}
这里使用ASP.NET MVC来显示结果,在View中传入的model可以在视图的Model对象直接获取数据(需要在视图页指定类型)
public class ArticleController: AdminControllerBase
{
public ActionResult Index()
{
var models = this.CmsService.GetArticle();
return View(models);
}
}
Razor视图页编写如下:
@model Qxun.Cms.Contract.Article <h2>显示文章的所有类型</h2> @if (Model!=null)
{
@Model.Name<br/>
foreach (var item in Model.Categorys)
{
<span>@item.Name</span><span>|@item.CreateTime</span> <br/>
}
}
通过下面的结果发现,已经把文章相关的类别加载进来了。通过类别加载文章原理是一样的,就不再写一遍了。
EntityFrameWork Code First 多对多关系处理的更多相关文章
- 【极力分享】[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 多对多关 ...
- EntityFramework Core2.0 多对多关系配置
在EF6.0 中,多对多关系配置时,系统会自动生成第三张表,来将两张有互相约束关系的表联系起来,但是在EF Core2.0中,我们需要手动建立第三张表,比如说有两个模型Passage.cs和Cat ...
- EntityFrameWork Code First 一对多关系处理
场景1: 一个文章类别(Category)下含有多篇文章(Article),而某篇文章只能对应一个类别 Article和Category的代码如下: /// <summary> /// 文 ...
- EntityFramework之多对多关系(四)
上篇介绍了一对多关系,下面介绍下多对多关系代码编写. 1.新建model实体,User是用户类,Role是角色类,由于是多对多关系,必须得有一个中间类,所以产生了UserRole类 public cl ...
- Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射?
Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射? 写在前面 阅读目录: 设计误区 数据库已死 枚举映射 关联映射 后记 在上一篇<一缕阳光:D ...
- EF里一对一、一对多、多对多关系的配置和级联删除
本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个PersonPhoto类,表示用户照片类 /// < ...
- 多对多关系<EntityFramework6.0>
无负载建立多对多关联的模型 原文中是Modeling a Many-to-Many Relationship with No Payload,虽然这么翻译也有点不准确,但是可以说明其目的,如下图所示, ...
- 11.Configure Many-to-Many(配置多对多关系)【Code-First系列】
现在学习EF Code-First多对多的配置. 这里我们举例:学生和班级实体,一个学生可以选修多个课程,多个学生也可以选修同一个课程. 一.使用数据注解特性,配置多对多的关系 using Syste ...
随机推荐
- logback 配置详解——logger、root
目录 1.根节点包含的属性 2.根节点的子节点 2.1.设置上下文名称: 2.2.设置loger.root 正文 回到顶部 1.根节点<configuration>包含的属性 scan: ...
- Jessica's Reading Problem——POJ3320
Jessica's Reading Problem——POJ3320 题目大意: Jessica 将面临考试,她只能临时抱佛脚的在短时间内将课本内的所有知识点过一轮,课本里面的P个知识点顺序混乱,而且 ...
- C# 字符,字符串和文本处理。
1. 字符: 在.net中 字符是表示成16为Unicode代码值.每个字符都是System.Char结构(一个值类型)的实例. public class StringTempte { public ...
- python之文件操作总结
目录 文件:数据的抽象和集合 文件的打开关闭 文件内容的读取 文件的全文本操作 文件的逐行操作 数据文件的写入 使用json模块 文件:数据的抽象和集合 文件是存储在辅助存储器上的数据序列 文件是数据 ...
- Linux Guard Service - 守护进程分裂
分裂守护进程 由于fork()后第一行仍然在循环中,使用fork()返回值鉴别当前进程的性质 int i = 0; for (i = 0; i < 10; i++) { // sleep(1); ...
- DEV 之 有些控件不允许拖动。
DEV 之 有些控件不允许拖动. 设置一个参数即可解决问题
- 基于 ZKEACMS 的云建站 / 自助建站解决方案
基于ZKEACMS的云建站 / 自助建站解决方案,一站式托管,解决企业建站需求,功能强大,高度自定义.用户只需在界面上输入一些基本信息,选择相应的主题 / 网站模板,然后就可以快速创建一个独一无二的网 ...
- ASP.NET Core URL Rewrite中间件
URL重写是基于一个或多个预置规则修改请求URL的行为.URL重写在资源位置和访问地址之间创建了一种抽象,这样二者之间就减少了紧密的联系.URL重写有多种适用的场景: 临时或永久移动或替换服务器资源, ...
- centos6和7的防火墙开关
CentOS6.5查看防火墙的状态: 1 [linuxidc@localhost ~]$service iptable status 显示结果: 1 2 3 4 5 [linuxidc@localho ...
- node.js 转载:有效
二.安装Node.js步骤 1.下载对应你系统的Node.js版本:https://nodejs.org/en/download/2.选安装目录进行安装3.环境配置4.测试 三.前期准备 1.Node ...