Lily.Core组件介绍,第一讲 实体的生成
Lily.Core组件是在Vs2003+Sqlserver2000下的开发和进行测试的。
Lily.Core组件是一个轻量级的和数据库打交道的并不是一个真正意义的是ORM组件。它只不是一多对或多对多的关系,必须靠手动维护各实体之间的关系。
Lily.Core中的实体对应于数据库的一个表,一个视图或一段查询语句。
Lily.Core对于事务的控制很弱,使用了Ado.Net中事务对象的传递来完成对事务的控制。
Lily.Core的设计只是针对于SqlServer2000数据库,不对Access,Orcal,MySql等其它的数据库提供支持。
好下面,我们看一个简单的例子:
数据库中有表结构如下:
IMA_物品
3 物品编号 int 4 0
0 物品名称 nvarchar 50 0
0 物品型号 nvarchar 50 0
0 单位 nvarchar 50 0
0 生产厂家 nvarchar 50 0
0 备注 nvarchar 50 0
注:物品编号是自动增长字段,如果需要对实体对象进行添加,删除,更新必须要定义一个自动增长字段。

一个数据表对应了一个描述数据表的实体类,对应一实体的容器,对应一操作实体的对象。
假设置我们在IMA_物品表中:物品名称+物品型号+生产厂家不能存在有相同的记录,生成的实体对象如下:
实体的操作类

Dim o As New IMA_物品_Operate
Dim en As New IMA_物品
Dim ec As IMA_物品_Container = o.GetEntityContainer(Lily.Core.SQL.Select().From(en))

'有时我们并不想在表格里显示所实体对象的所有列,则需要加下以下这段代码
'产生的结果是只有“物品名称”,“物品型号”,“单位”,“生产厂家”才在DataGrid中显示
ec.BindList.Add(en._物品名称)
ec.BindList.Add(en._物品型号)
ec.BindList.Add(en._单位)
ec.BindList.Add(en._生产厂家)


Me.DataGrid1.DataSource = ec
通过上面的语句,我们就可以IMA_物品所有的对象绑定到了DataGrid控件,可以进行编辑,删除,排序,就像把DataTable对象绑室DataGrid一样。当然没有DataTable强大。
绑定到了DataGrid我们就可进行日常的编辑操作,当编辑完成后我们就需要进行提交操作,下面的代码演示了如何把实体对象保存到数据库
If Not Me.DataGrid1.DataSource Is Nothing AndAlso TypeOf Me.DataGrid1.DataSource Is IMA_物品_Container Then
Dim ec As IMA_物品_Container = CType(Me.DataGrid1.DataSource, IMA_物品_Container)
Dim o As New IMA_物品_Operate
ec.AcceptChanges(o)
End If
<Browsable(False)> _
Public Overridable ReadOnly Property _物品名称() As IEntityField
Get
If f_物品名称 Is Nothing Then
f_物品名称 = CoreFactory.GetEntityField(Me, "物品名称", "物品名称", False, False, DbType.String, 50, True)
End If
Return f_物品名称
End Get
End Property
Lily.Core组件是一个轻量级的和数据库打交道的并不是一个真正意义的是ORM组件。它只不是一多对或多对多的关系,必须靠手动维护各实体之间的关系。
Lily.Core中的实体对应于数据库的一个表,一个视图或一段查询语句。
Lily.Core对于事务的控制很弱,使用了Ado.Net中事务对象的传递来完成对事务的控制。
Lily.Core的设计只是针对于SqlServer2000数据库,不对Access,Orcal,MySql等其它的数据库提供支持。
好下面,我们看一个简单的例子:
数据库中有表结构如下:
IMA_物品
3 物品编号 int 4 0
0 物品名称 nvarchar 50 0
0 物品型号 nvarchar 50 0
0 单位 nvarchar 50 0
0 生产厂家 nvarchar 50 0
0 备注 nvarchar 50 0
注:物品编号是自动增长字段,如果需要对实体对象进行添加,删除,更新必须要定义一个自动增长字段。

一个数据表对应了一个描述数据表的实体类,对应一实体的容器,对应一操作实体的对象。
假设置我们在IMA_物品表中:物品名称+物品型号+生产厂家不能存在有相同的记录,生成的实体对象如下:
1
Imports Lily
2
Imports Lily.Core
3
Imports System.ComponentModel
4
Public Class IMA_物品
5
Inherits EntityBase
6
类实例化
11
实体字段描述
86
实体属性
173
设置实体的属性
195
获取实体的属性
217
实体其它属性
240
End Class
241
实体的容器:
Imports Lily2
Imports Lily.Core3
Imports System.ComponentModel4
Public Class IMA_物品5
Inherits EntityBase6
类实例化11
实体字段描述86
实体属性173
设置实体的属性195
获取实体的属性217
实体其它属性240
End Class241

1
Imports lily
2
Imports lily.core
3
Public Class IMA_物品_Container
4
Inherits EntityContainer
5
Public Sub New()
6
MyBase.New()
7
End Sub
8
Public Sub New(ByVal operate As IMA_物品_Operate)
9
MyBase.New(operate)
10
End Sub
11
Public Shadows Function Add(ByVal entity As IMA_物品) As Integer
12
Return MyBase.Add(entity)
13
End Function
14
Default Public Shadows Property Item(ByVal index As Integer) As IMA_物品
15
Get
16
Return MyBase.Item(index)
17
End Get
18
Set(ByVal Value As IMA_物品)
19
MyBase.Item(index) = Value
20
End Set
21
End Property
22
Public Shadows Function IndexOf(ByVal value As IMA_物品) As Integer
23
Return MyBase.IndexOf(value)
24
End Function
25
Public Shadows Sub Insert(ByVal index As Integer, ByVal value As IMA_物品)
26
MyBase.Insert(index, value)
27
End Sub
28
Public Shadows Sub Remove(ByVal value As IMA_物品)
29
MyBase.Remove(value)
30
End Sub
31
Public Shadows Sub AcceptChanges(ByVal entityhandler As IMA_物品_Operate)
32
MyBase.AcceptChanges(EntityHandler)
33
End Sub
34
End Class
Imports lily2
Imports lily.core3
Public Class IMA_物品_Container4
Inherits EntityContainer5
Public Sub New()6
MyBase.New()7
End Sub8
Public Sub New(ByVal operate As IMA_物品_Operate)9
MyBase.New(operate)10
End Sub11
Public Shadows Function Add(ByVal entity As IMA_物品) As Integer12
Return MyBase.Add(entity)13
End Function14
Default Public Shadows Property Item(ByVal index As Integer) As IMA_物品15
Get16
Return MyBase.Item(index)17
End Get18
Set(ByVal Value As IMA_物品)19
MyBase.Item(index) = Value20
End Set21
End Property22
Public Shadows Function IndexOf(ByVal value As IMA_物品) As Integer23
Return MyBase.IndexOf(value)24
End Function25
Public Shadows Sub Insert(ByVal index As Integer, ByVal value As IMA_物品)26
MyBase.Insert(index, value)27
End Sub28
Public Shadows Sub Remove(ByVal value As IMA_物品)29
MyBase.Remove(value)30
End Sub31
Public Shadows Sub AcceptChanges(ByVal entityhandler As IMA_物品_Operate)32
MyBase.AcceptChanges(EntityHandler)33
End Sub34
End Class实体的操作类
1
Imports lily
2
Imports lily.core
3
Public Class IMA_物品_Operate
4
Inherits EntityHandler
5
公共方法
17
重写基类方法
39
End Class
Imports lily2
Imports lily.core3
Public Class IMA_物品_Operate4
Inherits EntityHandler5
公共方法17
重写基类方法39
End Class好,我们现在就完成了对于一个数据库的映射操作。当然这些代码是通过一个简单的代码生成器完成的。
第一步:获取系统中所有的IMA_物品表的记录

Dim o As New IMA_物品_Operate
Dim en As New IMA_物品
Dim ec As IMA_物品_Container = o.GetEntityContainer(Lily.Core.SQL.Select().From(en))
'有时我们并不想在表格里显示所实体对象的所有列,则需要加下以下这段代码
'产生的结果是只有“物品名称”,“物品型号”,“单位”,“生产厂家”才在DataGrid中显示
ec.BindList.Add(en._物品名称)
ec.BindList.Add(en._物品型号)
ec.BindList.Add(en._单位)
ec.BindList.Add(en._生产厂家)

Me.DataGrid1.DataSource = ec通过上面的语句,我们就可以IMA_物品所有的对象绑定到了DataGrid控件,可以进行编辑,删除,排序,就像把DataTable对象绑室DataGrid一样。当然没有DataTable强大。
绑定到了DataGrid我们就可进行日常的编辑操作,当编辑完成后我们就需要进行提交操作,下面的代码演示了如何把实体对象保存到数据库
If Not Me.DataGrid1.DataSource Is Nothing AndAlso TypeOf Me.DataGrid1.DataSource Is IMA_物品_Container Then
Dim ec As IMA_物品_Container = CType(Me.DataGrid1.DataSource, IMA_物品_Container)
Dim o As New IMA_物品_Operate
ec.AcceptChanges(o)
End If通过调用容顺的AcceptChanges方法自动完成了对实体对象的更新,删除,添加。
(这也要求每个数据表必须要有自动增长字段的原因。由于是离线操作,如果需要处理更新,删除影响的行数等于0或强制更新,需要手动添加代码进行控制。)
由于我们并没有在数据表中对 物品名称,物品型号,生产厂家设置联合主键,但又要求不允许存在有重复的记录所以在生成实体的字段后需要设置期实体字段的属性Uniqe=True.这样才进行更新和添加时组件会自动检查是否存在有重复的记录,如果存在有重复的记录将抛出异常。
下面是介绍如何设置实体的联合主键.最后一个参数设为True就代表当前实体存在有联合主键。
<Browsable(False)> _
Public Overridable ReadOnly Property _物品名称() As IEntityField
Get
If f_物品名称 Is Nothing Then
f_物品名称 = CoreFactory.GetEntityField(Me, "物品名称", "物品名称", False, False, DbType.String, 50, True)
End If
Return f_物品名称
End Get
End Property
总结:此小节主要是介绍了如何把一个数据表转换为一个实体对象,并简单的介绍了如何获取多个实体并绑定和如何更新到数据库。下一节,将介绍如何添加,更新,删除,查询实体对象。

浙公网安备 33010602011771号