一尘不染

强类型的DataContext如何工作?

sql

这是我今天上午早些时候仍在深入探讨的问题,我仍然感到困惑。我正在为我的应用程序使用强类型的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>();
    }
  }
}

请注意包含partialGetTable。有partial必要吗?

我假设我的第一个示例通过最终调用起作用GetTable,但是这段代码从何而来呢?我的数据上下文类的字段如何填充数据?


阅读 146

收藏
2021-05-23

共1个答案

一尘不染

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

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

对反射器的一些挖掘表明,ctor调用了private void InitTables(object schema),它 恰好 做到
(反射字段,通过分配它们GetTable(Type))。

2021-05-23