这是我今天上午早些时候仍在深入探讨的问题,我仍然感到困惑。我正在为我的应用程序使用强类型的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班上的一个领域。在我的代码中,我没有将其分配给任何东西。但是在其他地方,我正在阅读它,它具有价值。为什么?
Widgets
MyDatabase
在LINQ-to-SQL的其他示例中,包括由Visual Studio 2008的DBML布局工具生成的代码,数据上下文类可能如下所示:
public partial class MyDatabase : DataContext { public Table<Widget> Widgets { get { return GetTable<Widget>(); } } }
请注意包含partial和GetTable。有partial必要吗?
partial
GetTable
我假设我的第一个示例通过最终调用起作用GetTable,但是这段代码从何而来呢?我的数据上下文类的字段如何填充数据?
如果它们不是属性,则唯一合乎逻辑的结论是基本构造函数已分配了它们。出乎意料,也许但并非不可能。
在partial允许将多个代码文件合并成一个单一类; 你只需要它,如果你 已经 分开你的代码文件(通常为设计师)。
对反射器的一些挖掘表明,ctor调用了private void InitTables(object schema),它 恰好 做到 了 (反射字段,通过分配它们GetTable(Type))。
private void InitTables(object schema)
GetTable(Type)