我很确定我已经知道了答案,但我需要其他人证实。 问题涉及在实体框架中使用DbSet:Code First。 (使用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的对象保存到数据库中,并将放入TopClass-objects / ExampleA-object列表中的ExampleA,ExampleB和ExampleC的对象也保存到数据库中。如果我从数据库加载TopClass对象,则还将加载列表中的所有其他对象。换句话说,我可以通过TopClass的对象访问已保存到数据库的其他对象。
现在有一个问题,我一直在与我的同事讨论:
如果我想直接访问ExampleA的对象,而不必加载TopClass对象和所有其他相关对象(也不使用SQL编码或lambda表达式),我是否需要ExampleA的DbSet?或者是否可以减少从DbSet加载到仅包含我想要的对象?如果是,是否可以在不加载TopClass的情况下加载ExampleA的对象?
我认为一些答案是显而易见的。我自己认为必须有一个DbSet才能直接访问数据库中该类的对象,而无需加载TopClass对象。但是,我需要知道,不要相信,所以我要求你确认或否定(?)我的信念。至于我到目前为止在互联网上阅读的内容以及在某些文章中所使用的内容,DbSet在几个类中的使用强调了我的有效编码,但不是可能的和不可能的。
答案 0 :(得分: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
的