用LINQ to SQL进行数据层访问
用Designer组装DataContext
点击DataClasses.dbml节点,打开一个空的O/R Designer界面,这个界面有一个空的主区域和Method窗格。然后从存储数据的服务器或数据库资源管理器节点拖动表格到主窗口中,从而添加实体类和表示独立实体间关系的虚线。实体类之间的联系表示一个数据存储中的双向外部键关系。把第一个表格拖到设计器表面,从而添加一个默认无参数的New构造器。这个构造器是关于Data Context和它到AppName.exe.config或Web.config文件的<connectionStrings>元素的连接字符串。默认情况下,LINQ to SQL会自动把复数形式的表格名改为单数的实体类名字,但你可以在entity-class编辑这个名称。只需要几分钟就可以添加从原始Northwind样本数据库衍生的八个实体类。
现在来为父/子/孙子窗体建立一个WinForm数据源,按F5构建并编译你的项目,选择Data,然后选Add New Data Source启动DataSource配置向导。接下来,点击Next,在Choose Data Source Type对话框中选择Object,点Next,展开ProjectName节点,并选择databinding分层结构的最上面一个成员,本例中是Customer。最后,点击Finish。在DataSources窗口中,整个实体的层次结构由Customer实体和它们的关系链以对象图的形式表示出来。ASP.NET团队承诺在Orcas Beta 2.0版本中的Web工程会有一个LINQDataSource控件。
你可以在设计器中改变表,列和关系属性,但如果只是用为查询和更新而动态生成的T-SQL声明来进行简单测试的话,通常默认设置就可以满足要求了。如果表格包含一个时间戳列,是因为DataContext用它来进行并发冲突检测优化。添加时间戳列将把其它所有列的UpdateCheck属性设置为Never。这样,在更新和删除时就不用将现在的数据库值和原始值进行比较(时间戳除外)。
DataContext是LINQ to SQL层次结构中的顶层对象;它管理数据库的SqlClient连接,并为每一个数据存储表维护一个System.Data.Linq.Table(T的)实体 (Listing 1) 。DataContext同样会跟踪所有在内存中的实体(除非你明确地禁止实体跟踪),掌控数据存储表的更新,并使并发冲突的优化能够进行。表格(T的)的类实现了IEnumerable(T的)和LINQ-specific IQueryable(T的)的交互界面。这个类可以作为DataGridView和其它编辑控件的DataSource,或者是作为BindingSource组件的DataSource。LINQ to SQL把表示一对多的外部键关系的联合物化为一个EntitySet(T的),这是一个表格(T的)的扩展实现。这意味着你可以用对DataSets用的相同技术,通过Data Source窗口对象图来产生父/子/[孙子]窗体。
让我们用Northwind数据库作为例子来实验一下这个技术吧。从Data Source窗口把Customer节点以CustomerDataGridView或Details View的形式拖到窗体中。这样就添加了CustomerBindingSource和CustomerBindingNavigator,可以把它们作为父实体进行编辑。接下来,拖动Customer.Order_s联合节点到窗体中,从而创建同步的Order_sDataGridView/BindingSource。最后,拖动Customer.Orders.Order_Details节点到窗体中,从而添加Order_DetailsDataGridView/BindingSource。Order_s和Order_Details节点表示EntitySets,所以复数形式的名字比较合适。Order_实体有一个下划线后缀,这是因为Order标志符可能会和操作者的LINQ Order冲突,所以.NET的Pluralizer为它保留了下划线。
如果实体包含时间戳列,你必须从DataGridView控件里把这些列移去,因为这个控件会把时间戳的Byte()数据类型误认为是图像,当你的代码试图去填充它的时候就会抛出一个错误。OrdersDataGridView包括很多列,分别代表EntityRef(Customer的),EntityRef(Employee的),以及EntityRef(Shipper的),这些表示了联合的一个方面。类似地, OrderDetailsDataGridView有EntityRef(Order_的)和Entity Ref(Product的)列。把这些列从DataGridViews移除也是个不错的练习。
0
相关文章