zoukankan      html  css  js  c++  java
  • 继承映射关系 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("
    --- All Businesses ---");
                    foreach (var b in context.Businesses)
                    {
                        Console.WriteLine("{0} (#{1})", b.Name, b.LicenseNumber);
                    }
                    Console.WriteLine("
    --- 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("
    --- 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");
                        });
                }

    生成表结构

  • 相关阅读:
    Spring@Profile注解
    day 32 子进程的开启 及其用法
    day 31 udp 协议SOCK_DGRAM
    day 30 客户端获取cmd 命令的步骤
    day 29 socket 理论
    day 29 socket 初级版
    有关 组合 继承
    day 27 多态 接口 类方法 静态方法 hashlib 摘要算法模块
    新式类和经典类的区别
    day 28 hasattr getattr serattr delattr 和带__内置__ 类的内置方法
  • 原文地址:https://www.cnblogs.com/rohelm/p/4114621.html
Copyright © 2011-2022 走看看