强类型DataContext如何工作?

这是我今天早些时候提出的问题的深入延续, 我仍然难以理解。 我正在为我的应用程序使用强类型DataContext,虽然它发出警告,但它神奇地起作用。 它是如何做到的?

这是通常用于使用LINQ-to-SQL连接到数据库的代码。

class MyDatabase : DataContext { public Table Widgets; public Table 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-to-SQL的其他示例中,包括由Visual Studio 2008的DBML布局工具生成的代码,数据上下文类可能如下所示:

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

请注意包含partialGetTablepartial必要吗?

我假设我的第一个例子最终调用了GetTable ,但是这个代码来自哪里? 我的数据上下文类的字段是如何填充数据的?

如果它们不是属性,唯一合乎逻辑的结论是基础构造函数已经分配了它们。 意外,也许,但并非不可能。

partial允许您将多个代码文件合并为一个类; 如果你已经分离了你的代码文件(通常是设计师),你只需要它。

reflection器中的一些挖掘显示ctor调用private void InitTables(object schema) ,它正是这样做的(反映在字段上,通过GetTable(Type)分配它们)。