直接访问是否需要DBSet
本文关键字:DBSet 是否 访问 | 更新日期: 2023-09-27 18:03:10
我很确定我已经知道答案了,但我需要别人确认一下。问题涉及实体框架中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