【问题标题】:How does a strongly typed DataContext work?强类型 DataContext 是如何工作的?
【发布时间】:2010-02-01 19:40:17
【问题描述】:

这是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 来工作,但是这段代码是从哪里来的?我的数据上下文类的字段如何填充数据?

【问题讨论】:

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


    【解决方案1】:

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

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

    对反射器的一些挖掘表明,ctor 调用了 private void InitTables(object schema),它完全执行此操作(反射字段,通过 GetTable(Type) 分配它们)。

    【讨论】:

    • 多好!那么,从今天早上开始回答我的问题,这是虚假的吗?编译器无法感知构造函数中的反射,对吧?
    • @Mark - 对。警告不正确:编译器无法检测到反射。
    猜你喜欢
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 2018-07-06
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    相关资源
    最近更新 更多