实体框架代码优先 TPH 继承与通用存储库

发布于 2024-12-08 00:29:40 字数 962 浏览 1 评论 0原文

我可能误解了 code-first table-per-hierarchy 继承,但这是我的设置:我有 HTMLGadgets(和其他类型)继承自 Gadget,而 Gadget 继承自 Entity。实体有一个属性 Id,因此我可以在通用存储库中使用它,就像 本教程

public abstract class Entity {
    [Key]
    public int Id { get; set; }
}   

public abstract class Gadget : Entity {       
    public string Content { get; set; }
}

public class HTMLGadget : Gadget
{
    public string SomeProperty { get; set;}
}

为了实现 TPH 继承,我在上下文中使用了以下内容:

public DbSet<Gadget> Gadgets { get; set; }

因此,我希望所有内容都使用基本 Id,因此所有内容都是实体。但是我如何让它参与代码优先继承呢?我可以看到问题:如果我更改上下文以使其

public DbSet<Entity> Entities{ get; set; }

可能起作用,但我会将所有内容(除了小工具之外还有更多的表)放在一个层次结构表中!但我不明白如何让我的 EF POCO 类在小工具中“触底”,但仍然让小工具使用基本实体 Id 属性,以便它们可以在通用存储库中使用。有人可以帮忙吗?-

I'm probably misunderstanding code-first table-per-hierarchy inheritance, but this is my set-up: I have HTMLGadgets (and other types) inheriting from Gadget, which inherits from Entity. Entity has one property, Id, so I can use it in a generic repository, à la this tutorial.

public abstract class Entity {
    [Key]
    public int Id { get; set; }
}   

public abstract class Gadget : Entity {       
    public string Content { get; set; }
}

public class HTMLGadget : Gadget
{
    public string SomeProperty { get; set;}
}

To implement TPH inheritance I have this in my context:

public DbSet<Gadget> Gadgets { get; set; }

So, I want everything to use the base Id, so everything is an Entity. But how do I get that to participate in code first inheritance? I can see the problem: if I change the context to have

public DbSet<Entity> Entities{ get; set; }

it might work, but I'd have everything (there will be more tables other than gadgets) in one hierarchy table! But I can't see how I can get my EF POCO classes to 'bottom-out' at Gadgets, yet still have Gadgets use the base Entity Id property so they can be used in the generic repository. Can anyone help?-

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你没皮卡萌 2024-12-15 00:29:40

您不必映射Entity 类。引入DbSet将映射Entity类。如果您要将不同类型的小工具放在一个表中,请映射 Gadget 和其他子类。

EF 将使用 Entity` 类中声明的属性来映射子类。

You do not have to map Entity class. Introducing DbSet<Entity> will map Entity class. If you are going to sore different types of Gadgets in a single table, then map the Gadget and other sub classes.

The properties declared in Entity` class will be used by EF to map the sub classes.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文