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我们就可进行日常的编辑操作,当编辑完成后我们就需要进行提交操作,下面的代码演示了如何把实体对象保存到数据库
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_物品表中:物品名称+物品型号+生产厂家不能存在有相同的记录,生成的实体对象如下:
1Imports Lily
2Imports Lily.Core
3Imports System.ComponentModel
4Public Class IMA_物品
5 Inherits EntityBase
6类实例化
11实体字段描述
86实体属性
173设置实体的属性
195获取实体的属性
217实体其它属性
240End Class
241
实体的容器:2Imports Lily.Core
3Imports System.ComponentModel
4Public Class IMA_物品
5 Inherits EntityBase
6类实例化
11实体字段描述
86实体属性
173设置实体的属性
195获取实体的属性
217实体其它属性
240End Class
241
1Imports lily
2Imports lily.core
3Public 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
34End Class
2Imports lily.core
3Public 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
34End Class
实体的操作类
1Imports lily
2Imports lily.core
3Public Class IMA_物品_Operate
4 Inherits EntityHandler
5公共方法
17重写基类方法
39End Class
2Imports lily.core
3Public Class IMA_物品_Operate
4 Inherits EntityHandler
5公共方法
17重写基类方法
39End 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
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
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
总结:此小节主要是介绍了如何把一个数据表转换为一个实体对象,并简单的介绍了如何获取多个实体并绑定和如何更新到数据库。下一节,将介绍如何添加,更新,删除,查询实体对象。