1

我很确定我已经知道答案,但我需要其他人确认。问题涉及在实体框架中使用 DbSet:代码优先。(使用 C#)

让我们以这些小类为例:

class TopClass
{
    Public List<ExampleA> ListOne {get; set;}
    Public List<ExampleB> ListTwo {get; set;}

    //Other contents ...
}

class ExampleA
{
    Public List<ExampleC> ListTree {get; set;}

    //Other contents ...
}

class ExampleB
{
    //Contents ...
}

class ExampleC
{
    //Contents ...
}

所以 TopClass 有名为 ExampleA 和 ExampleB 的类的列表,而 ExampleA 有一个 ExampleC 的列表。

从 DbContext 继承的类可能是这样的:

class ExampleContext : DbContext
{
    public DbSet<TopClass> TopClasses {get; set}

    //Other contents..
}

Cuttently,只有 DbSet 是 TopClass 的一个。Topclasses的对象可以保存到数据库中,ExampleA、ExampleB和ExampleC的对象被放入TopClass-objects/ExampleA-object的列表中,也将被保存到数据库中。如果我从数据库中加载 TopClass 对象,列表中的所有其他对象也将被加载。换句话说,我可以通过 TopClass 的对象访问已保存到数据库中的其他对象。

现在有一个问题,我一直在与我的一位同事讨论:
如果我想直接访问 ExampleA 的对象,而无需加载 TopClass 对象和所有其他相关对象(也无需使用 SQL 编码或 lambda-表达式),我是否需要 ExampleA 的 DbSet?或者是否可以减少 DbSet 的负载以仅包含我想要的对象?如果是,是否甚至可以在不加载 TopClass 的情况下加载 ExampleA 的对象?

我认为有些答案是显而易见的。我自己相信必须有一个 DbSet 来直接访问数据库中该类的对象,而不必加载 TopClass 对象。但是,我需要知道,而不是相信,所以我要求您确认或否定(?)我的信念。至于到目前为止我在 Internet 上和一些文献中读到的内容,在几个课程中使用 DbSet 向我强调了有效的编码,但不是什么是可能的和不可能的。

4

1 回答 1

2

假设存在以下代码:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Configurations.Add(new TopClassMap());
    modelBuilder.Configurations.Add(new ExampleAMap());
    modelBuilder.Configurations.Add(new ExampleBMap());
    modelBuilder.Configurations.Add(new ExampleCMap());
    // ....
}

您可以使用以下方式访问每个:

ExampleContext context = new ExampleContext();
var a = context.Set<TopClass>();
var b = context.Set<ExampleA>();
var c = context.Set<ExampleB>();
// etc

您不需要声明特定(或实际上任何)DbSet

于 2013-03-08T11:54:36.530 回答