场景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. android开发内存优化之软引用

    所有Android的开发者一定都遇到过内存溢出这个头疼的问题,一旦出现这个问题,很难直接确定我们的应用是那里出了问题,要想定位问题的原因,必须通过一些内存分析工具和强大的经验积累才能快速的定位到问题具 ...

  2. windows下gitbook与开源中国码云关联,以及如何gitbook转pdf

    gitbook能够很方便的和github关联,实现团队协作的效果.可是github私有库需要付费.但是开源中国码云能够建私有库,于是考虑将gitbook关联码云,折腾了一番后,能够可视化的关联,后面就 ...

  3. python学习之路 五:函数式编程

    本节重点 掌握函数的作用.语法 掌握作用域.全局变量与局部变量知识 掌握函数名称空间.闭包 一.函数编程基础知识 1.基本定义 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数 ...

  4. 用Visual Studio 2015成功编译、发布UMDF驱动到目标机!!

    开发工具:Visual Studio 2015企业版 主      机:windows10 X64企业版,主机是安装了Visual Studio 2015的操作系统,主要进行驱动开发和调试. 目  标 ...

  5. dos 下脚本编写须知

    主题为:doc脚本运行结束后,不自动退出终端. 方法1假设你的bat名字叫rabbit.bat你可以新开一个bat,内容是start rabbit.bat然后这个新的bat是不会自动关闭的 注意,这个 ...

  6. codis__简介

    参考文档 https://github.com/wandoulabs/codis 中文简介 https://github.com/wandoulabs/codis/blob/master/doc/tu ...

  7. UITouch笔记

    UITouch是什么 表示在在屏幕上触摸事件,包括触摸的位置.大小.力度(3D touch).运动. 在一系列触摸事件中,UITouch都是同一个,但是不要retain某一个UITouch.如果要保存 ...

  8. 963 AlvinZH打怪刷经验(背包DP大作战R)

    963 AlvinZH打怪刷经验 思路 这不是一道普通的01背包题.大家仔细观察数据的范围,可以发现如果按常理来的话,背包容量特别大,你也会TLE. 方法一:考虑01背包的一个常数优化----作用甚微 ...

  9. 虚拟机上使用 opecnv 读取USB摄像头无法显示

    使用opecv读取USB摄像头时候,无法显示图像. 设置 首先查看虚拟机Ubuntu检测摄像头是否已正常插入: ls /dev/video* 结果为: 设置虚拟机USB属性: USB的兼容性设置为US ...

  10. Mockplus原型设计工具介绍

    一.原型设计工具简介 Mockplus (摹客)  一种快速原型设计工具 官网提供四个平台的下载,通用性很广. 二.原型设计的模板 Mockplus可以为设计者提供以下几种模板 其中在“手机”模板里, ...