场景1: 一个文章类别(Category)下含有多篇文章(Article),而某篇文章只能对应一个类别

Article和Category的代码如下:

/// <summary>
/// 文章信息
/// </summary>
public class Article:ModelBase
{
//标题
public string Title { get; set; }
//内容
public string Content { get; set; }
//类别
public Category Category { get; set; } }
public class Category:ModelBase
{
//类别名字
public string Name { get; set; }
//某类别下含很多文章
public ICollection<Article> Articles { get; set; }
}

下面是关键一步,在Entity Framework的OnModelCreating中通过Fluent API定义“一对多”关系:

表示站在Category的角度HasMany含有多篇Articles,WithRequired表明Articles必须包含文章类别

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<Category>().HasMany(c => c.Articles)
.WithRequired(a => a.Category);
base.OnModelCreating(modelBuilder);
} public DbSet<Article> Articles { get; set; }
public DbSet<Category> Categorys { get; set; } }

分别编写两个场景来测试以下结果:

public interface ICmsService
{
//Article GetArticle(int id);
Category GetCategory();
Article GetArticle();
}

使用LINQ to SQL 来查询Category和Articles
Include(),两表必须含有外键关系,只需要指定键名对应的类属性名即可,不需指定结果字段(即全部映射)。默认搜索某表时,不会顺带查询外键表,直到真正使用时才会再读取数据库查询;若是使用 Include(),则会在读取本表时把指定的外键表信息也读出来。

public Category GetCategory()
{
using (var session = new CmsDbContext())
{
return session.Categorys.Include("Articles").FirstOrDefault();
}
} public Article GetArticle()
{
using (var session = new CmsDbContext())
{
return session.Articles.Include("Category").FirstOrDefault();
}
}

这里使用ASP.NET MVC来显示结果:
在View中传入的model可以在视图的Model对象直接获取数据(需要在视图页指定类型),ViewData数据也可以在视图页可以获得(需要强制转换)

public class CategoryController : AdminControllerBase
{
//
// GET: /Cms/Category/ public ActionResult Index()
{
var model = this.CmsService.GetCategory();
ViewData["Acticle"] = this.CmsService.GetArticle();
return View(model);
} }

视图页:

@using Qxun.Framework.Contract
@using Qxun.Framework.Web.Controls
@using Qxun.Cms.Contract
@using Qxun.Web
@{
var secondPosition = ViewData["Acticle"] as Qxun.Cms.Contract.Article;
}
@model Qxun.Cms.Contract.Category
<h2>第一个场景加载Category过程中加载所有的Article</h2>
@if(@Model!=null){
if (Model.Articles != null)
{
foreach(var item in Model.Articles)
{
@item.ID<br/>
@item.Title<br/>
@item.Content<br/>
}
} } <h2>第二个场景加载Article得到Article是哪个Category</h2>
文章类别:@secondPosition.Category.Name

显示结果:

EntityFrameWork Code First 一对多关系处理的更多相关文章

  1. EntityFrameWork Code First 多对多关系处理

    场景2: 一个文章类别(Category)下含有多篇文章(Article),而文章也可能对应多个类别 Article和Category的代码更改如下: /// <summary> /// ...

  2. Code First06---CodeFirst中的一对多关系

    本章我将介绍Code First将类之间的引用关系映射为数据表之间的一对多关系的默认规则.主要包含以下两部分内容: 1.Code First将类之间的引用关系映射为数据表之间一对多关系的默认规则. 2 ...

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

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

  4. Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射?

    Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射? 写在前面 阅读目录: 设计误区 数据库已死 枚举映射 关联映射 后记 在上一篇<一缕阳光:D ...

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

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

  6. 《Entity Framework 6 Recipes》中文翻译系列 (6) -----第二章 实体数据建模基础之使用Code First建模自引用关系

    2-5 使用Code First建模自引用关系 问题 你的数据库中一张自引用的表,你想使用Code First 将其建模成一个包含自关联的实体. 解决方案 我们假设你有如图2-14所示的数据库关系图的 ...

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

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

  8. 10.Configure One-to-Many(配置一对多关系)【Code-First系列】

    现在,我们将学习怎么配置一对多的关系. Visit Entity Relationship section to understand how EF manages one-to-one, one-t ...

  9. EF Code First 学习笔记:关系

      一对多关系 项目中最常用到的就是一对多关系了.Code First对一对多关系也有着很好的支持.很多情况下我们都不需要特意的去配置,Code First就能通过一些引用属性.导航属性等检测到模型之 ...

随机推荐

  1. var 在linq中的使用

    一:掌握linq,写出超炫的代码 1. var关键字 [隐式类型] 隐式类型 和 匿名类型的不同叫法. 特性 和 属性 2.隐式类型 就是让编译器来推断的一种语法糖. 二:隐式类型的应用场景 1. 简 ...

  2. 在JS中,将text框中数据格式化,根据不同的小数位数,格式化成对应的XXX,XXX,XXX.XX(2位小数) 或者XXX,XXX,XXX(0位小数)

    //在JS中,将text框中数据格式化,根据不同的小数位数,格式化成对应的XXX,XXX,XXX.XX(2位小数) 或者XXX,XXX,XXX(0位小数) function formatNum(num ...

  3. Spring Boot专题背景简介

    鄙人13年毕业,不曾在圈子里写过总结,因此文笔颇不自信. 但人生永远没有太晚的开始,现在开始做些笔记,借此巩固下学到的新知识. 一些题外话: 前段时间,做个小项目,由于某些原因,使用Java来写(之前 ...

  4. what eats up the performance in the interior scene?

    - baseline (7w rps/core) - switch from large accelerator to regular accelerator (9w rps/core) - repl ...

  5. system idle process

    偶然发现windows环境任务管理其中存在进程 system idle process,cpu占用极大但内存占用很小.google了一下,保存下结果 system idle process :系统空闲 ...

  6. [SDOI2009] HH的项链 | 莫队模板

    题目链接:戳我 题意:求区间中不同颜色的种类数 因为是要过知识点,所以又把这题拿出来做了一遍......这里就写两种方法吧 主席树做法 设pre[i]为第i个点上的颜色在前面序列中出现的最晚的一次的位 ...

  7. fatal: Authentication failed for又不弹出用户名和密码 解决办法

    各位,如果能弹出来,一定是你账号密码搞错了,就别继续看了.   image.png 切换命令行:   image.png 依然报错, 说到这个问题,又可以长篇大论了, 我使用的是tortoisegit ...

  8. mysql 启动提示:错误2系统找不到指定文件

    详情见这个方法 其实就是更改了启动目录导致的 https://blog.csdn.net/su749520/article/details/78963878

  9. “全栈2019”Java第十二章:变量

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  10. Leetcode 856. Score of Parentheses 括号得分(栈)

    Leetcode 856. Score of Parentheses 括号得分(栈) 题目描述 字符串S包含平衡的括号(即左右必定匹配),使用下面的规则计算得分 () 得1分 AB 得A+B的分,比如 ...