如何使用Entity Framework访问子表

4
我有以下表格:AnimalConcreteAnimal。如果我采用数据库优先的方法,可能会对这个例子产生影响。假设它们是不同的实体。然后我有2个DBSet(s)生成,可以分别更新任意一个表格。一旦我在实体设计器中将ConcreteAnimal设置为Animal的子项,事情就改变了。实体设计器中的ConcreteAnimal实体集字段被禁用,并自动填充其父类Animal的实体集值。在上下文中不再生成ConcreteAnimalDBSet。这意味着我不能再访问第二个子表格。我应该如何将ConcreteAnimal添加到数据库?这是预期的行为吗?如果是,背后的逻辑是什么?
编辑:好的,我尝试了以下代码并且可以工作。
using(var context = new MyEntities())
{
    var concreteAnimal = new ConcreteAnimal
        {
            //setting properties here
            //both for Animal and specific to ConcreteAnimal
        };
    context.Animals.Add(concreteAnimal);
    context.SaveChanges();
}

神奇的事情发生了,两个表都被正确地填充了数据。这很好。然而,我觉得为什么我们只有针对基类的DBSet并不合乎逻辑?

1个回答

2

您当前正在使用TPT继承。

通用信息保存在Animal表中,特定类型的具体信息保存在其自己的表中。

您可以在以下文章中找到您要查找的信息:

编辑

为什么我们只有基类有DBSet

这实际上是一个很好的问题,我无法给出确切的答案,但我认为这不是默认实现的原因是因为这是不必要和非常令人困惑的。

想象一下一些非常复杂的TPT情况,有许多继承,他们将拥有每个具体类的一个DbSet(这可能会很容易增加数百个DbSet),那么现在您将不得不问自己,从哪个DbSet中检索、添加或删除该具体类型。

生成代码后,您可以很容易地自己添加代码(在部分类中),它将正常工作。

public DbSet<ConcreteAnimal> ConcreteAnimals { get; set; }

这实际上并没有回答我的问题。我知道我正在使用TPT。我的问题很具体——为什么我们只有基本类型的DBSet? - Ingweland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接