继承映射关系 TPH、TPT、TPC<EntityFramework6.0>

每个类型一张表【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 string City { get; set; }
        public string State { get; set; }
        public string ZIPCode { get; set; }
    }
    public class eCommerce : Business
    {
        public string URL { get; set; }
    }public class BusinessesContext : DbContext
    {
        public DbSet<Business> Businesses { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<Business>()
                .Property(b=>b.BusinessId)
                .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            modelBuilder.Entity<Business>().ToTable("Business", "halower");
            modelBuilder.Entity<Retail>().ToTable("Retail", "halower");
            modelBuilder.Entity<eCommerce>().ToTable("eCommerce", "halower");
        }
    }

怎么使用

 private static void Main(string[] args)
        {
            using (var context = new BusinessesContext())
            {

                var retail = new Retail
                {
                    Name = "Shop and Save",
                    LicenseNumber = "200C",
                    Address = "101 Main",
                    City = "Anytown",
                    State = "TX",
                    ZIPCode = "76106"
                };
                context.Businesses.Add(retail);
                var web = new eCommerce
                {
                    Name = "BuyNow.com",
                    LicenseNumber = "300AB",
                    URL = "www.buynow.com"
                };
                context.Businesses.Add(web);
                context.SaveChanges();
            }
            using (var context = new BusinessesContext())
            {
                Console.WriteLine("\n--- All Businesses ---");
                foreach (var b in context.Businesses)
                {
                    Console.WriteLine("{0} (#{1})", b.Name, b.LicenseNumber);
                }
                Console.WriteLine("\n--- Retail Businesses ---");
                //OfType<T>:根据指定类型筛选
                foreach (var r in context.Businesses.OfType<Retail>())
                {
                    Console.WriteLine("{0} (#{1})", r.Name, r.LicenseNumber);
                    Console.WriteLine("{0}", r.Address);
                    Console.WriteLine("{0}, {1} {2}", r.City, r.State, r.ZIPCode);
                }
                Console.WriteLine("\n--- eCommerce Businesses ---");
                foreach (var e in context.Businesses.OfType<eCommerce>())
                {
                    Console.WriteLine("{0} (#{1})", e.Name, e.LicenseNumber);
                    Console.WriteLine("Online address is: {0}", e.URL);
                }
                Console.ReadKey();
            }
        }

生成表结构

运行效果

每个继承层次一张表【TPH】

声明方式

  public abstract class Employee
        {
            public int EmployeeId { get; protected set; }
            public string FirstName { get; set; }
            public string LastName { get; set; }
        }

        public class FullTimeEmployee : Employee
        {
            public decimal? Salary { get; set; }
        }

        public class HourlyEmployee : Employee
        {
            public decimal? Wage { get; set; }
        }

        public class EmployeeContext: DbContext
        {
            public DbSet<Employee> Employees { get; set; }

            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                base.OnModelCreating(modelBuilder);
                modelBuilder.Entity<Employee>()
                    .HasKey(e => e.EmployeeId)
                    .Property(e => e.EmployeeId)
                    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
                modelBuilder.Entity<Employee>()
                    .Map<FullTimeEmployee>(m => m.Requires("EmployeeType").HasValue(1))
                    .Map<HourlyEmployee>(m => m.Requires("EmployeeType").HasValue(2));
            }

怎么使用

      private static void Main(string[] args)
        {
            using (var context = new EmployeeContext())
            {
                var fte = new FullTimeEmployee
                {
                    FirstName = "Jane",
                    LastName = "Doe",
                    Salary = 71500M
                };
                context.Employees.Add(fte);
                fte = new FullTimeEmployee
                {
                    FirstName = "John",
                    LastName = "Smith",
                    Salary = 62500M
                };
                context.Employees.Add(fte);
                var hourly = new HourlyEmployee
                {
                    FirstName = "Tom",
                    LastName = "Jones",
                    Wage = 8.75M
                };
                context.Employees.Add(hourly);
                context.SaveChanges();
            }
            using (var context = new EmployeeContext())
            {
                Console.WriteLine("--- All Employees ---");
                foreach (var emp in context.Employees)
                {
                    bool fullTime = !(emp is HourlyEmployee);
                    Console.WriteLine("{0} {1} ({2})", emp.FirstName, emp.LastName,
                        fullTime ? "Full Time" : "Hourly");
                }
                Console.WriteLine("--- Full Time ---");
                foreach (var fte in context.Employees.OfType<FullTimeEmployee>())
                {
                    Console.WriteLine("{0} {1}", fte.FirstName, fte.LastName);
                }
                Console.WriteLine("--- Hourly ---");
                foreach (var hourly in context.Employees.OfType<HourlyEmployee>())
                {
                    Console.WriteLine("{0} {1}", hourly.FirstName, hourly.LastName);

                }
            }
            Console.ReadKey();
        }

生成表结构

运行效果

每个子类一张表【TPC】

声明方式

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                base.OnModelCreating(modelBuilder);
                modelBuilder.Entity<Employee>()
                    .HasKey(e => e.EmployeeId)
                    .Property(e => e.EmployeeId)
                    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
                modelBuilder.Entity<FullTimeEmployee>()
                    .Map(m =>
                    {
                        m.MapInheritedProperties();
                        m.ToTable("FullTimeEmployee");
                    });
                modelBuilder.Entity<HourlyEmployee>()
                    .Map(m =>
                    {
                        m.MapInheritedProperties();
                        m.ToTable("HourlyEmployee");
                    });
            }

生成表结构

时间: 2024-10-03 14:39:43

继承映射关系 TPH、TPT、TPC<EntityFramework6.0>的相关文章

EF里的继承映射关系TPH、TPT和TPC的讲解以及一些具体的例子

EF里的继承映射关系TPH.TPT和TPC的讲解以及一些具体的例子 本章节讲解EF里的继承映射关系,分为TPH.TPT.TPC.具体: 1.TPH:Table Per Hierarchy 这是EF的默认的继承映射关系:一张表存放基类和子类的所有列,自动生成的discriminator列用来区分基类和子类的数据.新建一个度假村Resort实体类试试: /// <summary> /// 度假村类 /// </summary> public class Resort : Lodging

hibernate笔记--继承映射关系的三种实现方式

单表继承映射(一张表): 假设我们现在有三个类,关系如下: Person类有两个子类Student和Teacher,并且子类都具有自己独有的属性.这种实体关系在hibernate中可以使用单表的继承映射来建表,最后生成的表是这样的: 可以看到我们只需要建立一张表就可以维护这个关系,这种方式就是单表继承映射,下面介绍配置方法: 新建实体类Person ,Student,和Teacher : public class Person { private int id; private String n

hibernate的3种继承映射关系总结——TPH,TPS,TPC

Java类中有继承关系,相应的在hibernate中,也有继承关系,子类反应到数据库中,就有多种实现形式了,子类和父类可以映射到同一张表中,子类也可以单独映射成一张表,但是用不同的标签实现,子类表和父类表的关系也不同. 下面对以前做的project进行总结一下 为了将程序领域中的继承关系反映到数据 中,Hibernate为我们提供了3中方案: 第一种方案:每棵类继承树一张表(Table Per Hierarchy)TPH 第二种方案:每个子类一张表(Table Per Subclass)TPS

Code First 中的 TPH TPT TPC

public class Blog { public int Id { get; set; } public DateTime Creationdate { get; set; } public string ShortDescription { get; set; } public string Title { get; set; } public string AboutTheAuthor { get; set; } } public class PictureBlog : Blog { p

继承映射关系 joinedsubclass的查询

会出现下面这样的错一般是配置文件中的mapping和映射文件中的package路径或者class中的name路径不一致 org.hibernate.MappingException: Unknown entity: com.zh.hibernate.joinedsubclass.Student    at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:1141)    at

继承映射关系 subclass的查询

Person大类的映射文件配置 1 <hibernate-mapping package="com.zh.hibernate.subclass"> 2 3 <class name="Person" table="PERSONS" discriminator-value="PERSONS"> 4 5 <id name="id" type="java.lang.Integ

EF-CodeFirst 继承关系TPH、TPT、TPC

继承关系 面向对象的三大特征之一:继承 ,在开发中起到了重要的作用.我们的实体本身也是类,继承自然是没有问题.下面开始分析 EF里的继承映射关系TPH.TPT.TPC 现在我们有这样一个需求,用户里要有一批超级用户,他们有着与生具来的优越.可以体验到更高级的服务.但是超级用户也是用户,可以去继承我们的普通用户类 (其实个人感觉不是很合理,因为我们有UserRole表,给一个超级用户的角色就可以了.这里仅做演示) /// <summary> /// 超级用户 /// </summary&g

《Entity Framework 6 Recipes》中文翻译系列 (36) ------ 第六章 继承与建模高级应用之TPC继承映射

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-12  TPC继承映射建模 问题 你有两张或多张架构和数据类似的表,你想使用TPC继承映射为这些表建模. 解决方案 假设我们有如图6-18所示的表. 图6-18 表Toyota和BMW有相似的结构,它们可以成为派生至实体Car的派生类型 在图6-18中,表Toyota和BMW有相似的架构(Schema),并描述类似的数据.BMW表只多了额外的一列,它用一bit值来指示对应的实例是否具有避

《Entity Framework 6 Recipes》中文翻译系列 (35) ------ 第六章 继承与建模高级应用之TPH继承映射中使用复合条件

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-11  TPH继承映射中使用复合条件 问题 你想使用TPH为一张表建模,建模中使用的复杂条件超过了实框架能直接支持的能力. 解决方案 假设我们有一张Member表,如图6-15所示.Member表描述了我们俱乐部的会员信息.在我们的模型中,我们想使用TPH为派生类,AdultMember(成人会员).SeniorMember(老年人会员)和TeenMember(青少年会员)建模. 图6-