场景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/>
}
}

通过下面的结果发现,已经把文章相关的类别加载进来了。通过类别加载文章原理是一样的,就不再写一遍了。

最新文章

  1. ASP.NET MVC企业级实战目录
  2. web兼容学习分析笔记-margin 和padding浏览器解析差异
  3. 第一章 JavaScript简史
  4. Linux第三次学习笔记
  5. java post请求
  6. asdoc 档案
  7. JavaScript 性能分析新工具 OneProfile
  8. Java 多线程之内存一致性错误
  9. 80C51 数码管动态显示0~7
  10. linux 运维,代理,acl控制访问
  11. USB Audio设计与实现
  12. 使用 MSIX 打包 DotNetCore 3.0 客户端程序
  13. program--历史故事
  14. 牛客寒假算法基础集训营6 J-迷宫
  15. 一文犀利看懂中美贸易战 z
  16. Python学习过程笔记整理(一)
  17. [CODE FESTIVAL 2016]Encyclopedia of Permutations
  18. 11073 最热门的K个搜索串
  19. 我们为什么需要 lock 文件
  20. 微信公众平台网页开发实战--3.利用JSSDK在网页中获取地理位置(HTML5+jQuery)

热门文章

  1. bootstrap css排版
  2. Backup--完整备份会打破现有的日志备份链么?
  3. 判断客户端是iOS还是Android,判断是不是在微信浏览器打开
  4. Linux Centos下SQL Server 2017安装和配置
  5. MySQL8.0本地访问设置为远程访问权限
  6. OpenGL学习脚印:背面剔除(Face Culling)
  7. IO模型《四》多路复用IO
  8. django admin后台的简单使用
  9. [Swift实际操作]八、实用进阶-(8)使用performSegue在故事板页面之间进行数据传递
  10. leetcode-682-Baseball Game