gpt4 book ai didi

c# - Entity Framework TPH 在抽象基类和空继承类场景中更改鉴别器列

转载 作者:太空宇宙 更新时间:2023-11-03 23:04:45 25 4
gpt4 key购买 nike

我有一张 table :

Groups
- Id
- Name
- Type

这张表是一组产品、客户或供应商。要对产品进行分组,我需要在类型列中使用“P”,对客户和供应商进行分组,我需要分别使用“C”和“S”。

我想知道我是否可以在这里使用 TPH。就像创建一个包含除 Type 之外的所有字段的抽象类 Group,然后创建空的子类 ProductGroup、ClientGroup 和 SupplierGroup,然后将 Type 列配置为具有值“P”、“C”和“S”的鉴别器以映射到它们各自的类。

我尝试这样做,但当 Group 类是抽象类或继承类为空时,EF 似乎没有正确猜测我的意图。

我的类(class)如下:

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”,代码也将按我预期的方式工作。

请问是bug还是我走错路了

我想到了这个主意,因为我的老板想要在我们的网络 API 中使用一个端点“/productgroups”,而且我发现在系统中使用一个特定的产品组类会很有趣,而不是使用一个泛型组并且必须到处过滤 .Where(e => e.Type == "P")。我认为后一种方法在处理传递的对象时不太清楚。

有人知道怎么解决吗?我真的必须将我的 Group 类具体化吗?我不喜欢它,Group 类似乎需要是抽象的,因为实际上我只有填充了 Type 字段的组。

最佳答案

您缺少的是 EF 继承基于单个 多态 DbSet,而不同的策略(TPH、TPT 和 TPC)控制物理存储模型在数据库中。

话虽如此,您的 DbContext 中需要以下内容(删除您目前放置的 ProductGroups):

public DbSet<Group> Groups { get; set; }

所有的 CRUD 操作都应该通过 DbSet。如果您需要特定的后代,您应该使用 OfType 方法。请注意,与使用具有显式 Type 属性的单个类相比,它可能会引入更多问题,因为 EF 不向您提供对鉴别器列的任何访问权限,因此在决定仅出于该目的使用它之前请仔细考虑。

关于c# - Entity Framework TPH 在抽象基类和空继承类场景中更改鉴别器列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41718784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com