这是 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
类的一个字段。在我的代码中,我没有将它分配给任何东西。但在其他地方,我正在阅读它并且它具有值(value)。为什么?
在 LINQ-to-SQL 的其他示例中,包括由 Visual Studio 2008 的 DBML 布局工具生成的代码,数据上下文类可能如下所示:
public partial class MyDatabase : DataContext {
public Table<Widget> Widgets {
get {
return GetTable<Widget>();
}
}
}
请注意包含 partial
和 GetTable
。 partial
是否必要?
我假设我的第一个示例通过最终调用 GetTable
来工作,但是这段代码来自哪里?如何用数据填充我的数据上下文类的字段?
最佳答案
如果它们不是属性,唯一合乎逻辑的结论是基本构造函数已经分配了它们。或许出乎意料,但并非不可能。
partial
允许您将多个代码文件组合成一个类;只有当您 分离了您的代码文件时才需要它(通常用于设计人员)。
在反射器中的一些挖掘表明 ctor 调用了 private void InitTables(object schema)
,它正是这样做(反射(reflect)在字段上,通过 GetTable(Type)
分配它们)。
关于c# - 强类型 DataContext 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2179502/