我有一张桌子:
Groups
- Id
- Name
- Type
此表是一组产品、客户或供应商。要对产品进行分组,我需要在 Type 列中使用“P”,要对客户和供应商进行分组,我需要分别使用“C”和“S”。
我想知道我是否可以在这里使用 TPH。就像创建一个包含除 Type 之外的所有字段的抽象类 Group,然后创建空子类 ProductGroup、ClientGroup 和 SupplierGroup,然后将 Type 列配置为具有值“P”、“C”和“S”的鉴别器以映射到它们各自类。
我尝试这样做,但是当 Group 类是抽象的或继承的类为空时,EF 似乎无法正确猜测我的意图。
我的课程如下:
abstract class Group {
public int Id { get; set; }
public string Name { get; set; }
}
class ProductGroup : Group
{}
// I did not create the other two classes yet.
我在 DbContext 中的配置如下:
public class DataContext : DbContext
{
public DbSet<ProductGroup> ProductGroups { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new GroupConfiguration());
}
}
class GroupConfiguration : EntityTypeConfiguration<Group>
{
public GroupConfiguration()
{
Map<ProductGroup>(m =>
{
m.Requires("Type").HasValue("P");
});
}
}
我认为它应该可以工作,但是使用上面的代码,datacontext.ProductGroups 将返回所有组,而不仅仅是产品组。
我测试并发现如果我的 Group 类是具体的,代码将按我的预期工作,datacontext.ProductGroups 中的组将只是产品组。
我还测试并发现,如果我保留我的 Group 类抽象但移动 ProductGroup 类的字段“Name”,代码也将按预期工作。
我想知道这是一个错误,还是我走错了路。
我想出了这个想法,因为我的老板想要在我们的 web api 中使用一个端点“/productgroups”,我发现在系统中使用一个特定的产品组类会很有趣,而不是使用一个通用组和必须.Where(e => e.Type == "P")
到处过滤。我认为在处理传递的对象时,后一种方法不太清楚。
有谁知道如何解决这个问题?我真的需要将我的 Group 课程具体化吗?我不喜欢它,Group 类似乎需要是抽象的,因为实际上我只有填充了 Type 字段的组。