强类型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(); } } }
请注意包含partial
和GetTable
。 partial
必要吗?
我假设我的第一个例子最终调用了GetTable
,但是这个代码来自哪里? 我的数据上下文类的字段是如何填充数据的?
如果它们不是属性,唯一合乎逻辑的结论是基础构造函数已经分配了它们。 意外,也许,但并非不可能。
partial
允许您将多个代码文件合并为一个类; 如果你已经分离了你的代码文件(通常是设计师),你只需要它。
reflection器中的一些挖掘显示ctor调用private void InitTables(object schema)
,它正是这样做的(反映在字段上,通过GetTable(Type)
分配它们)。