2013-03-08 73 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()); 
    // .... 
} 

您可以使用訪問每個