2013-03-08 43 views
1

我很确定我已经知道答案,但我需要确认其他人。 这个问题涉及在实体框架中使用DbSet:Code First。 (使用C#)DBSet是否需要直接访问?

让我们用这些小类为例:

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有一个名为例A和例B类的列表,例A具有ExampleC的列表。

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

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

    //Other contents.. 
} 

Cuttently,有只DbSet是一个用于TOPCLASS。顶级对象可以保存到数据库中,并且放入TopClass对象/ ExampleA对象列表中的ExampleA,ExampleB和ExampleC的对象也将被保存到数据库中。如果我从数据库加载TopClass对象,那么列表中的所有其他对象也将被加载。换句话说,我可以访问通过TopClass的对象保存到数据库的其他对象。

现在有,我已经与我的collegue讨论的问题是:
如果我要例A的对象的直接访问,而无需加载TOPCLASS对象和所有其他相关的对象(也无需使用SQL编码或lambda表达式),我是否需要ExampleA的DbSet?或者是否可以减少从DbSet加载到只包含我想要的对象?如果是的话,甚至可以在不加载TopClass的情况下加载ExampleA的对象?

我假设一些答案很明显。我自己相信必须有一个DbSet才能直接访问数据库中该类的对象,而无需加载TopClass对象。但是,我需要知道,不相信,所以我要求你确认或否定(?)我的信念。至于我在互联网上迄今阅读的内容,有些文献中,使用DbSet的几个类强调我有效的编码,但不是可能的和不可能的。

回答

2

假设下面的代码存在:

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

你并不需要(或任何确实)宣布具体的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()); 
    // .... 
} 

您可以使用访问每个