Entity Framework 4.3 - TPH mapping and migration error

前端 未结 1 616
失恋的感觉
失恋的感觉 2020-12-09 21:23

I\'m using Entity Framework 4.3 with code first and manual migrations. I\'m trying to map a TPH (table-per-hierarchy) setup which uses two custom discriminator fields. One f

相关标签:
1条回答
  • 2020-12-09 21:35

    This is a known issue with 4.3 and 4.3.1. (We found it too late to put the fix in 4.3.1.) Luckily there is a fairly simple way to change your code that should make it work.

    In a nutshell, you used to be able to make chained map calls on a single EntityConfiguration in 4.1. and 4.2. Something like this pattern:

    modelBuilder.Entity<Parent>()
        .Map<Foo>(...)
        .Map<Bar>(...);
    

    This doesn't work in 4.3 and instead you have to make each Map call on an EntityConfiguration for that entity. So a pattern something like this:

    modelBuilder.Entity<Foo>()
       .Map<Foo>(...);
    
    modelBuilder.Entity<Bar>()
       .Map<Bar>(...);
    

    Taking your case specifically, this should work:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<ParentClass>()
            .ToTable("Parent");
    
        modelBuilder.Entity<Foo>()
            .Map(m =>
                    {
                        m.Requires("IsActive").HasValue(1);
                        m.Requires("Type").HasValue("Foo");
                    });
    
        modelBuilder.Entity<Bar>()
            .Map(m =>
                    {
                        m.Requires("IsActive").HasValue(1);
                        m.Requires("Type").HasValue("Bar");
                    });
    }
    

    (I've removed a few of the generic parameters since they aren't needed, but that's not important.)

    Doing this using explicit EntityConfigurations you would use something like this:

    public class ParentConfiguration : EntityTypeConfiguration<ParentClass>
    {
        public ParentConfiguration()
        {
            ToTable("Parent");
        }
    }
    
    public class FooConfiguration : EntityTypeConfiguration<Foo>
    {
        public FooConfiguration()
        {
            Map(m =>
            {
                m.Requires("IsActive").HasValue(1);
                m.Requires("Type").HasValue("Foo");
            });
        }
    }
    
    public class BarConfiguration : EntityTypeConfiguration<Bar>
    {
        public BarConfiguration()
        {
            Map(m =>
            {
                m.Requires("IsActive").HasValue(1);
                m.Requires("Type").HasValue("Bar");
            });
        }
    }
    

    And then

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations
            .Add(new ParentConfiguration())
            .Add(new FooConfiguration())
            .Add(new BarConfiguration());
    }
    

    We plan to fix this in 5.0.

    0 讨论(0)
提交回复
热议问题