强类型DataContext如何工作?

时间:2010-02-01 19:40:17

标签: c# sql linq linq-to-sql

这是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>();
    }
  }
}

请注意包含partialGetTablepartial是否必要?

我假设我的第一个例子最终调用了GetTable,但是这个代码来自哪里?我的数据上下文类的字段是如何用数据填充的?

1 个答案:

答案 0 :(得分:3)

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

partial允许您将多个代码文件合并到一个类中;如果你分开你的代码文件(通常是设计师),你只需要它。

反射器中的一些挖掘表明ctor调用了private void InitTables(object schema),它完全完全(反映在字段上,通过GetTable(Type)分配它们。)