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");
                        });
                }

    生成表结构

  • 相关阅读:
    asp.net c#中去掉最后一个字符和去掉第一个字母
    两个div并排
    VS.Net2005中使用本地化功能实现多语言的切换
    gridview嵌套DropDownList選定值[转]
    C# 获取系统时间
    NERDTree,好用的文件浏览器
    通过$.browser来判断浏览器
    vim 智能提示
    让vim显示函数列表
    vim中文乱码解决方法
  • 原文地址:https://www.cnblogs.com/rohelm/p/4114621.html
Copyright © 2011-2022 走看看