C# 强类型DataContext是如何工作的?
这是一个深入的延续,我仍然感到困惑。我正在为我的应用程序使用一个强类型的DataContext,虽然它会发出警告,但它神奇地工作了。它是如何做到这一点的 下面是使用LINQtoSQL连接数据库时通常使用的代码C# 强类型DataContext是如何工作的?,c#,sql,linq,linq-to-sql,C#,Sql,Linq,Linq To Sql,这是一个深入的延续,我仍然感到困惑。我正在为我的应用程序使用一个强类型的DataContext,虽然它会发出警告,但它神奇地工作了。它是如何做到这一点的 下面是使用LINQtoSQL连接数据库时通常使用的代码 class MyDatabase : DataContext { public Table<Widget> Widgets; public Table<Car> Cars; public MyDatabase (string connection) :
class MyDatabase : DataContext {
public Table<Widget> Widgets;
public Table<Car> Cars;
public MyDatabase (string connection) : base(connection) { }
}
Widgets
似乎是MyDatabase
类的一个字段。在我的代码中,我没有把它分配给任何东西。但在其他地方,我从中阅读,它有价值。为什么?
在LINQ to SQL的其他示例中,包括由Visual Studio 2008的DBML布局工具生成的代码,数据上下文类可能如下所示:
public partial class MyDatabase : DataContext {
public Table<Widget> Widgets {
get {
return GetTable<Widget>();
}
}
}
公共部分类MyDatabase:DataContext{
公共表小部件{
得到{
返回GetTable();
}
}
}
注意包含了partial
和GetTable
。是否需要部分
我假设我的第一个示例最终调用了GetTable
,但这段代码来自哪里?我的数据上下文类的字段是如何用数据填充的?如果它们不是属性,唯一的逻辑结论是基本构造函数已经分配了它们。也许出乎意料,但并非不可能
partial
允许您将多个代码文件合并到一个类中;只有在分离了代码文件(通常用于设计器)的情况下才需要它
一些深入反射器的研究表明,ctor调用私有void InitTables(objectschema)
,它确实做到了这一点(通过GetTable(Type)
对字段进行反射)!那么,从今天早上开始回答我的问题,这是假的吗?就像编译器无法感知构造函数中的反射一样,对吗?@Mark-right。警告不正确:编译器无法检测反射。
public partial class MyDatabase : DataContext {
public Table<Widget> Widgets {
get {
return GetTable<Widget>();
}
}
}