zoukankan      html  css  js  c++  java
  • 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(1);
            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/>      
        }
    }


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


  • 相关阅读:
    Java Android程序员软件开发知识:枚举的介绍,以及代码的编写教程。
    Android中实现全屏、无标题栏的两种办法(另附Android系统自带样式的解释)
    Android(java)开发之将double类型,强制保留到小数点后两位解决方法。
    Android开发之第三方推送JPush极光推送知识点详解 学会集成第三方SDK推送
    Android开发之清除缓存功能实现方法,可以集成在自己的app中,增加一个新功能。
    输入流、输出流
    关键字和继承
    java集合
    SpringMVC框架拦截器
    SpringMVC框架基础
  • 原文地址:https://www.cnblogs.com/chenjianxiang/p/4715528.html
Copyright © 2011-2022 走看看