这是my question from earlier this morning的深入延续,我仍然难以理解。我正在为我的应用程序使用强类型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-to-SQL的其他示例中,包括由Visual Studio 2008的DBML布局工具生成的代码,数据上下文类可能如下所示:
public partial class MyDatabase : DataContext {
public Table<Widget> Widgets {
get {
return GetTable<Widget>();
}
}
}
请注意包含partial
和GetTable
。 partial
是否必要?
我假设我的第一个例子最终调用了GetTable
,但是这个代码来自哪里?我的数据上下文类的字段是如何用数据填充的?
答案 0 :(得分:3)
如果它们不是属性,唯一合乎逻辑的结论是基础构造函数已经分配了它们。意外,也许,但并非不可能。
partial
允许您将多个代码文件合并到一个类中;如果你将分开你的代码文件(通常是设计师),你只需要它。
反射器中的一些挖掘表明ctor调用了private void InitTables(object schema)
,它完全完全(反映在字段上,通过GetTable(Type)
分配它们。)