Evil 域

当Evil遇上先知

导航

VB9.0新特性之LINQ(五) - 数据库生成的类

Posted on 2008-07-29 22:25  Saar  阅读(877)  评论(0编辑  收藏  举报

上一文中,我们介绍了用LINQ读取数据库中数据的三个步骤。本文将来看看通过OR设计器生成的类。通过本文,你可以了解到为什么我们从数据库中把表拖到OR设计器上以后,就可以用LINQ来获取数据了,让我们来看看,这个.dbml背后发生的故事……

 

首先,我们通过解决方案浏览器,来看看当新建了一个.dbml后,会生成哪些文件:

在解决方案浏览器里,首先点下上方第二个按钮,显示所有文件。然后,在NbStorage.dbml下,就列出了以下文件:

NbStorage.dbml.layout

NbStorage.designer.vb

NbStorage.vb

第一个文件,NbStorage.dbml.layout其实是一个XML,用来保存NbStorage.dbml的显示布局,因此没有什么好说的。

第二个文件,NbStorage.designer.vb里的花样就不少了。让我们双击打开之,然后,通过类名列表,可以看到,一共生成了两个类,分别是NbStorageDataContext类和NotebookStorage类。

这两个类是从哪儿来的呢?大家还记得在上一篇里,我们创建的.dbml文件的主文件名吗?对了,就是NbStorage,于是,这里,就会生成一个“文件名DataContext”的类,用来充当数据库的角色。对这个名字不满意?在OR设计器空白处单击,然后,修改属性窗口里的“Name”属性就能修改对应的类的名称了。

因此,可以推断,每创建一个.dbml文件,就会生成一个对应的DataContext类。

另一个类,NotebookStorage与.dbml文件中有的表的名称相同。这就是一个用来映射表的实体。此类的名称映射表的名称;类中属性映射表的列。代码初生成的时候,属性的名称与列的名称是一致的,如果想要修改这之间对应关系,可以在OR设计器中,选择一个属性,然后,察看属性窗口:

以Id列为例,我们可以看到上下两个Id,一个是Name,另一个是Source。见名知义,Name对应类中属性的名称;而Source对应数据表中的列的名称。因此,我们可以把Name属性中的ID改名为NbID。切换到NbStorage.designer.vb,我们可以看到如下代码:

 

 1    <Column(Name:="Id", Storage:="_Id", AutoSync:=AutoSync.OnInsert, DbType:="Int NOT NULL IDENTITY", IsPrimaryKey:=true, IsDbGenerated:=true)>  _
 2    Public Property NbID() As Integer
 3        Get
 4            Return Me._Id
 5        End Get
 6        Set
 7            If ((Me._Id = value)  _
 8                        = falseThen
 9                Me.OnNbIDChanging(value)
10                Me.SendPropertyChanging
11                Me._Id = value
12                Me.SendPropertyChanged("NbID")
13                Me.OnNbIDChanged
14            End If
15        End Set
16    End Property

 

可以看到,属性名称已经改变成了“NbID”,但是,其Column标记中,仍然绑定到Id属性,因此,对NbID的操作,会被映射到数据库表中对应的Id列中去。

 

因此,我们可以推想,如果有两个表,就会生成三个类;三个表四个类……一个类,用来充当数据库;其它的类,则为数表库表的实体模型。

 

做三层架构的开发的时候,通常,我们会把实体类与数据访问类放在不同的Namespace里。在LINQ中,同样可以把它们分开放在不同的Namespace里。非常简单,只要设置两个属性就行了。在OR编辑器空白处单击,观察属性窗口,大家会看到两个Namespace的属性。

ContextNamespace即为对应的DataContext类所在的Namespace,Entity Namespace则是实体类的Namespace——好像很废话啊。呵呵,大家试试把两个设置到不同的Namespace里就明白怎么用了。

其实,它就是在NbStorage.designer.vb的两个类上添加不同的Namespace,仅此而已。功能虽小,但还算比较实用。

第三个类,在上文中,我们已经有所涉及,它是NbStorage.designer.vb中的类的Partial类。可以用来重写一些方法。例如,我们在上文中提到的重写.ToString()方法,就是存放在这个文件里的。

 

呵呵,这样子一看,是不是觉得,LINQ已经不再那么神奇了?一个数据库类,N个对应表的类,每个对应的表的类中,属性对应了表的列,简单吧?嗯,这里只提到了一个表,所以,不存在表与表的关系。在实际系统中,当涉及到1:1或者1:M关系时,映射还会更复杂一些。