直接访问是否需要DBSet



我很确定我已经知道答案了,但我需要别人确认一下。问题涉及实体框架中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有一个名为exampleplea和ExampleB的类的列表,而exampleplea有一个ExampleC的列表。

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

class ExampleContext : DbContext
{
    public DbSet<TopClass> TopClasses {get; set}
    //Other contents..
}

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

现在有一个问题,我一直在与我的一位同事讨论:
如果我想直接访问ExampleA的对象,而不必加载TopClass-object和所有其他相关对象(也不使用sql编码或lambda表达式),那么我是否需要为ExampleA使用DbSet ?或者是否可以减少DbSet的加载,只包括我想要的对象?如果是的话,是否有可能在不加载TopClass的情况下加载ExampleA对象?

我想有些答案是显而易见的。我个人认为,必须使用DbSet来直接访问数据库中该类的对象,而不必加载TopClass-object。然而,我需要知道,而不是相信,所以我请求你证实或否定我的信仰。至于我到目前为止在网上和一些文献上读到的东西,对我来说,在几个类中使用DbSet强调的是有效的编码,而不是什么是可能的,什么是不可能的。

假设存在以下代码:

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

最新更新