EF6 расширяет иерархию TPH (смешивая TPH и TPT)

У меня есть таблица, используемая для хранения нескольких унаследованных объектов в конфигурации TPH. Это работает хорошо, и нет никаких проблем по этому поводу. Проблема, с которой я столкнулся, заключается в том, что мне нужно расширить некоторые из этих сущностей дополнительными полями и хочу, чтобы эти новые поля хранились в собственной таблице с использованием TPT.

Чтобы дать вам некоторый контекст, я приведу вам пример: TPH хранит корневой класс PERIOD и несколько унаследованных, таких как QUARTER, MONTH, WEEK и т. д., используя поле дискриминатора. Итак, теперь мне нужно создать специальный КВАРТАЛ с некоторыми дополнительными полями и сохранить эти дополнительные поля в своей собственной таблице.

Возможно ли это в EF? Я использую EF 6.1 и не нашел рабочего образца или объяснения того, как выполнить этот конкретный сценарий.

Заранее спасибо,

Андрес.


person Andres    schedule 23.06.2014    source источник


Ответы (1)


   public abstract class Period
    {
        public int  Id { get; set; }

        public string DisplayName { get; set; }

    }

    public class Month : Period {
        public byte MonthValue { get; set; }

    }

    public class Quarter : Period {
        public byte QuarterValue { get; set; }

    }

    public class SpecialQuarter : Quarter {
        public int SpecialQuarterValue { get; set; }
    }

    public class TestContext : DbContext {
        public DbSet<Period> Periods { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<Period>().ToTable("Period");

            // TPH
            modelBuilder.Entity<Month>().Map(p => p.Requires("PeriodType").HasValue("M"));
            modelBuilder.Entity<Quarter>().Map(p => p.Requires("PeriodType").HasValue("Q"));

            //TPT
            modelBuilder.Entity<SpecialQuarter>().Map(p => p.ToTable("SpecialQuarter"));
        }
    }

Этот контекст сопоставляется с этими таблицами.

CREATE TABLE [dbo].[Period] (
    [Id] [int] NOT NULL IDENTITY,
    [DisplayName] [nvarchar](max),
    [MonthValue] [tinyint],
    [QuarterValue] [tinyint],
    [PeriodType] [nvarchar](128) NOT NULL,
    CONSTRAINT [PK_dbo.Period] PRIMARY KEY ([Id])
)
CREATE TABLE [dbo].[SpecialQuarter] (
    [Id] [int] NOT NULL,
    [SpecialQuarterValue] [int] NOT NULL,
    CONSTRAINT [PK_dbo.SpecialQuarter] PRIMARY KEY ([Id])
)
person codeworx    schedule 23.06.2014