场景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. java-03 变量与运算符

    1.java中的变量与常量 1.1 变量的定义: 变量,顾名思义就是会变的量,这种思想来源于数学,指的是一个不确定的量或者随时会改变的量. 在我们进行编程的过程中,有一些东西是会随着实际情况而发生变化 ...

  2. 7z文件格式及其源码的分析(三)

    上一篇在这里.  这是7z文件格式分析的第三篇, 相信有了前两篇的准备,你已经了解了7z源码的大致结构, 以及如何简单调试7z的源码了. 很多同学是不是迫不及待想要拔去7z的神秘外衣,看看究竟了. 好 ...

  3. /Date(1512551901709+0800)/转换

    var convertDT=function(dt) { dt.replace(/Date\([\d+]+\)/, function (a) { eval('d = new ' + a) }); al ...

  4. C#开源定时回调库PETimer的使用

    PETimer PETimer开源项目GitHub地址:点击跳转 PETimer 1.双端通用:基于C#语言实现的高效便捷计时器,可运行在服务器(.net core/.net framework)以及 ...

  5. C# redis 的简单应用

    region 准备参数 var connStr = "localhost:6379,password="; var db = 2; SiteRedisHelper redisHel ...

  6. ie8在win7系统下怎么安装或重装?[转载]

    (一)对于已卸载了IE8的用户 因为微软并没有提供用于Windows 7系统的IE8独立安装包,Windows 7用户是无法通过下载安装包的方法来重装IE8的,而是默认将IE8的安装程序集成在Wind ...

  7. python列表重复判断

    import random import string n = 0; while n<10: str_source = string.ascii_letters + string.digits ...

  8. Blocks to Cubes

    Bholu the Pandit on this New Year wanted to divide his Cuboidal Packaging block into cubes. But he l ...

  9. react.js学习之路六

    学习react中,我一直认为,总组件里面才有构造函数,但是我才发现我的观点是错误的,构造函数是可以出现在子组件里面的. 今天有一个错误是点击增加/减少input框里面 的数值 我一直在寻找input框 ...

  10. SFML从入门到放弃(1) 窗口和交互

    SFML从入门到放弃(1) 窗口和交互 创建一个新窗口: sf::RenderWindow window(sf::VideoMode(,),"new window"); 但是光创建 ...