2010-02-01 72 views
4

這是my question from earlier this morning的深入延續,我仍然難以理解。我爲我的應用程序使用強類型的DataContext,雖然它發出警告,但它神奇地工作。它是如何做到的?強類型DataContext是如何工作的?

下面是通常用於使用LINQ to SQL連接到數據庫的代碼。

class MyDatabase : DataContext { 
    public Table<Widget> Widgets; 
    public Table<Car> Cars; 

    public MyDatabase (string connection) : base(connection) { } 
} 

即使它發出警告,它仍然可以使用。人們可以使用開始從它讀:

using (var db = new MyDatabase(connectionString)) { 
    foreach (var w in db.Widgets) 
    Console.WriteLine(w); 
} 

Widgets似乎是MyDatabase類的字段。而在我的代碼中,我沒有把它分配給任何東西。但在其他地方,我正在閱讀,它有價值。爲什麼?

在LINQ到SQL的其他實例,包括Visual Studio 2008中的DBML佈局工具生成的代碼,數據上下文類可能是這樣的:

public partial class MyDatabase : DataContext { 
    public Table<Widget> Widgets { 
    get { 
     return GetTable<Widget>(); 
    } 
    } 
} 

通知partialGetTable列入。 partial是必要的嗎?

我假設我的第一個例子最終通過調用GetTable工作,但是這個代碼來自哪裏?我的數據上下文類的字段是如何填充數據的?

回答

3

如果它們不是屬性,唯一合乎邏輯的結論是基礎構造函數已經分配它們。意想不到,也許,但並非不可能。

partial允許您將多個代碼文件合併到一個類中;你只需要它,如果你的分隔你的代碼文件(通常爲設計師)。

一些挖掘在反射器示出了構造函數調用到private void InitTables(object schema),它不恰好此(反映在田野,經由GetTable(Type)分配它們)。

+0

Muy bueno!那麼,從今天上午回答我的問題,這是虛假嗎?儘管編譯器無法感知構造函數中的反射,對吧? – 2010-02-01 20:00:20

+0

@Mark - 正確。警告不正確:編譯器無法檢測反射。 – 2010-02-01 20:40:24

相關問題