c# - 强类型 DataContext 如何工作?

标签 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 类的一个字段。在我的代码中,我没有将它分配给任何东西。但在其他地方,我正在阅读它并且它具有值(value)。为什么?

在 LINQ-to-SQL 的其他示例中,包括由 Visual Studio 2008 的 DBML 布局工具生成的代码,数据上下文类可能如下所示:

public partial class MyDatabase : DataContext {
  public Table<Widget> Widgets {
    get {
      return GetTable<Widget>();
    }
  }
}

请注意包含 partialGetTablepartial 是否必要?

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

最佳答案

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

partial允许您将多个代码文件组合成一个类;只有当您 分离了您的代码文件时才需要它(通常用于设计人员)。

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

关于c# - 强类型 DataContext 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2179502/

相关文章:

c# - 为什么在使用 CreateFile ("CONOUT$"...) 将控制台重定向回事件屏幕缓冲区后没有文本颜色?

c# - Linq 2 XML : How to retrieve web methods' names from a wsdl document?

sql - POSTGRESQL:创建表作为选择特定类型的列

sql - Oracle 中针对集合类型 'object' 进行批量收集

c# - 我怎样才能结合这些线?

c# - VB.Net 'Overridable' 对成员变量声明无效

c# - 检查datagridview的单元格中的数据是否为空

mysql - varchar 类型列的排序依据

c# - 为通用 C# 集合中的每个值调用一个函数

.net - 为什么 DataTable.Rows 没有 .Where() 方法?