• Lerning Entity Framework 6 ------ Introduction to TPH



    Sometimes, you have created two models. They have the same parent class like this:

    public class Person
    {
        public int PersonId { get; set; }
    
        public string PersonName { get; set; }
    }
    
    public class InsidePerson : Person
    {
        public string Title { get; set; }
    
        public string Department { get; set; }
    }
    
    public class OutsidePerson : Person
    {
        public string CompanyName { get; set; }
    }
    

    After you execute the command Update-Database in nuget command line, Entity Framework will create one table named people:

    图片.png-6.6kB

    The Discriminator column is created for discriminating what model dose current row represent. this model creating type is called TPH(Table per Hierarchy Inheritance). Let's do a test. Add some codes in main function:

    static void Main(string[] args)
    {
        using (MyDbContext db = new MyDbContext())
        {
            Person insidePerson1 = new InsidePerson()
            {
                PersonName = "InsidePerson1",
                Title = "Manager",
                Department = "development"
            };
            db.People.Add(insidePerson1);
    
            InsidePerson insidePerson2 = new InsidePerson()
            {
                PersonName = "InsidePerson2",
                Title = "Manager",
                Department = "development"
            };
            db.People.Add(insidePerson2);
    
            InsidePerson insidePerson3 = new InsidePerson()
            {
                PersonName = "InsidePerson3",
                Title = "Manager",
                Department = "development"
            };
            db.InsidePeople.Add(insidePerson3);
    
            Person outsidePerson1 = new OutsidePerson()
            {
                PersonName = "outsidePerson1",
                CompanyName = "Tencent"
            };
            db.People.Add(outsidePerson1);
    
            db.SaveChanges();
        }
    }
    

    Let's look at the database:

    图片.png-6.6kB

    If you don't like the discriminator column which entity framework auto create, you can define your column by adding these codes in OnModelCreating function of DbContext class:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    
        modelBuilder.Entity<Person>()
            .Map<InsidePerson>(p => p.Requires("PersonType").HasValue(1))
            .Map<OutsidePerson>(p => p.Requires("PersonType").HasValue(2));
    }
    

    Then, execute the command Add-Migration AddPesonTypeColumn2PeopleTable and Update-Database in nuget command line. Now, look at the database again:

    图片.png-6.5kB

    We can find the Entity Framework can't insert any value into PersonType column of existed rows. It's a little sad. Now, We insert some new data by coding:

    static void Main(string[] args)
    {
        using (MyDbContext db = new MyDbContext())
        {
            Person insidePerson4 = new InsidePerson()
            {
                PersonName = "InsidePerson4",
                Title = "Manager",
                Department = "development"
            };
            db.People.Add(insidePerson4);
    
            Person outsidePerson2 = new OutsidePerson()
            {
                PersonName = "outsidePerson2",
                CompanyName = "Baidu"
            };
            db.People.Add(outsidePerson2);
    
            db.SaveChanges();
        }
    }
    

    Look at the databas again:

    图片.png-9.1kB

    That's all.

  • 相关阅读:
    报错Required String parameter 'customerInfo' is not present的原因及处理办法
    Mybatis 中$与#的区别
    ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql
    Git使用
    前后端分离
    对excel文件的读取
    POI导入和导出Excel总结
    git权限
    @RequestParam与@PathVariable
    lombok学习
  • 原文地址:https://www.cnblogs.com/zzy0471/p/6811269.html
Copyright © 2020-2023  润新知