我有一个用于在TPH配置中存储多个继承实体的表。 这很好用,没有问题。 我面临的问题是我需要使用其他字段扩展其中一些实体,并希望使用TPT将这些新字段存储在自己的表中。
为了说明一些情况,我会给你一个例子: TPH使用鉴别器字段存储根PERIOD类和几个继承的类,如QUARTER,MONTH,WEEK等。 所以现在我需要创建一个带有一些额外字段的特殊QUARTER,并希望将这些附加字段存储在自己的表中。
这可能在EF吗?我正在使用EF 6.1,但没有找到有关如何完成此特定方案的工作示例或解释。
提前致谢,
安德烈。
答案 0 :(得分:2)
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])
)