自连接<EntityFramework6.0>

自引用

 public class PictureCategory
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int CategoryId { get; private set; }
        public string Name { get; set; }
        public int? ParentCategoryId { get; private set; }
        public virtual PictureCategory ParentCategory { get; set; }
        public virtual ICollection<PictureCategory> SubPictureCategories { get; set; }

        public PictureCategory()
        {
            SubPictureCategories = new HashSet<PictureCategory>();
        }
    }

    public class PictureCategoryContext : DbContext
    {
        public virtual DbSet<PictureCategory> PictureCategories { get; set; }
        public PictureCategoryContext() : base("name=DemoContext") { }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<PictureCategory>()
                .HasKey(p=>p.CategoryId)
                .HasMany(p => p.SubPictureCategories)
                .WithOptional(t => t.ParentCategory)
                .HasForeignKey(t=>t.ParentCategoryId);
        }
    }

怎么使用?

private static void Main()
        {
            using (var context = new PictureCategoryContext())
            {
                var _1st = new PictureCategory { Name = "第1代" };
                var _2st = new PictureCategory { Name = "第2代" };
                var _3_1st = new PictureCategory { Name = "第3_1代" };
                var _3_2st = new PictureCategory { Name = "第3_2代" };
                var _3_3st = new PictureCategory { Name = "第3_3代" };
                var _4st = new PictureCategory { Name = "第4代" };
                var _5_1st = new PictureCategory { Name = "第5_5_1代" };
                var _5_2st = new PictureCategory { Name = "第5_2代" };
                _1st.SubPictureCategories = new List<PictureCategory> { _2st };
                _2st.SubPictureCategories = new List<PictureCategory> { _3_1st, _3_2st, _3_3st };
                _3_3st.SubPictureCategories = new List<PictureCategory> { _4st };
                _4st.SubPictureCategories = new List<PictureCategory> { _5_1st, _5_2st };
                context.PictureCategories.Add(_1st);
                context.SaveChanges();
            }

            using (var context=new PictureCategoryContext())
            {
               var query = context.PictureCategories.Where(p=>p.ParentCategory==null).ToList();
               query.ForEach(t => Print(t,1));
            }

            Console.ReadKey();
        }

        private static void Print(PictureCategory category, int level)
        {
            Console.WriteLine("{0}--{1}", category.Name, level);
            category.SubPictureCategories.ToList().ForEach(t=>Print(t,level+1));
        }

效果:

模型如下:

再次我们分析一下该关系模型所涉及到degree, multiplicity, and direction:
degree【度】:  一元

multiplicity【复合度,在UML中很常见,也就是重复度】:  0..1和*;因为一个Parent有N个children,而每一个child只能有1个Parent

direction【流向】:   双向

这三个术语详细的介绍看这里

Database relationships are characterized by degree, multiplicity, and direction. Degreeis the number of entity types that participate in the relationship. Unary and binary relationships are the most common. Tertiary and n-place relationships are more theoretical than practical.
Multiplicityis the number of entity types on each end of the relationship. You have seen the multiplicities 0..1 (zero or 1), 1 (one), and * (many).
Finally, the directionis either one-way or bidirectional.
The Entity Data Model supports a particular kind of database relationship called an Association Type. 
An Association Type relationship has either unary or binary degree, multiplicities 0..1, 1, or *, and a direction that is bidirectional

时间: 2024-10-07 07:04:32

自连接<EntityFramework6.0>的相关文章

EntityFramework6.0的Sql读写分离拦截器 和 MVC的 Action拦截器 对比

EF的DbCommandInterceptor类 拦截: EF6.1也出来不少日子了,6.1相比6.0有个很大的特点就是新增了System.Data.Entity.Infrastructure.Interception 命名空间,此命名空间下的对象可以允许我们更加方便的了解到EF运行时的一些信息,当然我们最想看的还是EF生成的Sql语句,话不多讲,开始干吧; class EFIntercepterLogging : DbCommandInterceptor { private readonly

继承映射关系 TPH、TPT、TPC&lt;EntityFramework6.0&gt;

每个类型一张表[TPT] 声明方式 public class Business { [Key] public int BusinessId { get; protected set; } public string Name { get; set; } public string LicenseNumber { get; set; } } public class Retail : Business { public string Address { get; set; } public str

分割一个表到多个实体&lt;EntityFramework6.0&gt;

声明方式 public class Photograph { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int PhotoId { get; set; } public string Title { get; set; } public byte[] ThumbnailBits { get; set; } [ForeignKey("PhotoId")] public virtual Photog

将一个实体数据保存到不同的数据表中&lt;EntityFramework6.0&gt;

2014-11-22声明方式 1 public class Product 2 { 3 [Key] 4 [DatabaseGenerated(DatabaseGeneratedOption.None)] 5 public int SKU { get; set; } 6 public string Description { get; set; } 7 public decimal Price { get; set; } 8 public virtual string ImageURL { get

EntityFramework6.0读书笔记【二】-----实体数据模型基础【上】

序言 在这一篇中,我们将演示EnitityFramework基本的建模[建模也是EntityFramework最核心的特性]范例,例如实体的分离和继承等.我们开始了演示如何创建一个简单的概念模型的例子,然后让EnitityFramework建立底层数据库.在余下的例子中,我们将告诉你如何从现有的表和数据库关系创建模型. 创建一个简单的Model 1.点击添加新建项,选择Data下的ADO.NET实体模型,并选择空模型. 2.右键选择新增实体 3.将实体命名为Person,实体集命名为People

EntityFramework6.0读书笔记【一】-----序言

Entity Framework是微软战略性的数据访问技术,不同与早期访问技术,Entity Framework并不耦合在Visual Studio中,它提供了一个全面的, 基于模型的生态系统,使您能够开发包括桌面.互联网.云计算和基于服务的应用程序等 历史 EFVersion1 支持Database Frist EFVersion4 支持Database Frist+Model First[along with full Plain Old CLR Object (POCO) support

WebMisSharp升级说明,最新版本1.6.0

尊敬的C3 AM.C3 FX.WebMisSharp用户您好: 非常感谢长期来您对WebMisSharp系列产品的支持,您的使用和反馈是我们进步的最大动力.在你们的帮助下我们又向前迈进了一步,我们功能升级啦!!! 本邮件为作者JackChain群发,您可能仅是某一个产品的使用者,或许您已经忘记这些产品.没关系,我简单提醒下: C3 AM:企业级通用权限管理系统,SAAS平台,体验地址http://saas.chinacloudtech.com C3 FX:企业级快速开发框架,是配合WebMisS

VS2012 安装低版本EntityFrameWork5.0

VS2012使用EntityFrameWork CodeFirst和自动生产控制器模型的问题 1.VS2012 model 模型直接生成数据库: CodeFrist功能,主要使用EntityFrameWork6.0,EntityFrameWork5.0不支持会报错. 2.安装EntityFrameWork6.0,有互联网的条件下: 3.EntityFrameWork6.0不支持控制器直接生成前端代码,主要是6.1以上版本和VS2012不兼容导致,所以需要回装到EntityFrameWork5.0

如何在VS2013或更低版本中使用EntityFramework6.x连接mysql

在这就不多说entityframework相比ADO的各种利弊了.文笔不好请见谅. 近日使用entityframework6.0连接mysql,遇到各种问题,在百度谷歌上有许多帖子但是均无法解决情况.所以发一帖子提供完整可行的解决方案. 一,实体数据模型创建向导中出现MysqlDatabase: 1:安装MySQL for Visual Studio 1.1.1(含以上版本) 2:安装MySQL Connector Net 6.8.3(含以上版本) 3:安装Nuget包管理器,在vs的拓展功能中