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_物品表中:物品名称+物品型号+生产厂家不能存在有相同的记录,生成的实体对象如下:
1
Imports
Lily
2
Imports
Lily.Core
3
Imports
System.ComponentModel
4

Public
Class IMA_物品
Class IMA_物品
5
Inherits EntityBase
6
类实例化#Region "类实例化"
7
Public Sub New()Sub New()
8
MyBase.new()
9
End Sub
10
#End Region
11
实体字段描述#Region "实体字段描述"
12
Private f_物品编号 As IEntityField
13
14
<Browsable(False)> _
15
Public Overridable ReadOnly Property _物品编号()Property _物品编号() As IEntityField
16
Get
17
If f_物品编号 Is Nothing Then
18
f_物品编号 = CoreFactory.GetEntityField(Me, "物品编号", "物品编号", True, False, DbType.Int32, 4)
19
End If
20
Return f_物品编号
21
End Get
22
End Property
23
24
Private f_物品名称 As IEntityField
25
26
<Browsable(False)> _
27
Public Overridable ReadOnly Property _物品名称()Property _物品名称() As IEntityField
28
Get
29
If f_物品名称 Is Nothing Then
30
f_物品名称 = CoreFactory.GetEntityField(Me, "物品名称", "物品名称", False, False, DbType.String, 50, True)
31
End If
32
Return f_物品名称
33
End Get
34
End Property
35
36
Private f_物品型号 As IEntityField
37
38
<Browsable(False)> _
39
Public Overridable ReadOnly Property _物品型号()Property _物品型号() As IEntityField
40
Get
41
If f_物品型号 Is Nothing Then
42
f_物品型号 = CoreFactory.GetEntityField(Me, "物品型号", "物品型号", False, False, DbType.String, 50, True)
43
End If
44
Return f_物品型号
45
End Get
46
End Property
47
48
Private f_单位 As IEntityField
49
50
<Browsable(False)> _
51
Public Overridable ReadOnly Property _单位()Property _单位() As IEntityField
52
Get
53
If f_单位 Is Nothing Then
54
f_单位 = CoreFactory.GetEntityField(Me, "单位", "单位", False, False, DbType.String, 50)
55
End If
56
Return f_单位
57
End Get
58
End Property
59
60
Private f_生产厂家 As IEntityField
61
62
<Browsable(False)> _
63
Public Overridable ReadOnly Property _生产厂家()Property _生产厂家() As IEntityField
64
Get
65
If f_生产厂家 Is Nothing Then
66
f_生产厂家 = CoreFactory.GetEntityField(Me, "生产厂家", "生产厂家", False, False, DbType.String, 50, True)
67
End If
68
Return f_生产厂家
69
End Get
70
End Property
71
72
Private f_备注 As IEntityField
73
74
<Browsable(False)> _
75
Public Overridable ReadOnly Property _备注()Property _备注() As IEntityField
76
Get
77
If f_备注 Is Nothing Then
78
f_备注 = CoreFactory.GetEntityField(Me, "备注", "备注", False, False, DbType.String, 50)
79
End If
80
Return f_备注
81
End Get
82
End Property
83
84
85
#End Region
86
实体属性#Region "实体属性"
87
Private md_物品编号 As Integer
88
89
<Browsable(True)> _
90
Public Overridable Property 物品编号()Property 物品编号() As Integer
91
Get
92
Return md_物品编号
93
End Get
94
Set(ByVal Value As Integer)
95
96
md_物品编号 = Value
97
Me.OnPropertyChanged("物品编号")
98
End Set
99
End Property
100
101
Private md_物品名称 As String = String.Empty
102
103
<Browsable(True)> _
104
Public Overridable Property 物品名称()Property 物品名称() As String
105
Get
106
Return md_物品名称
107
End Get
108
Set(ByVal Value As String)
109
110
md_物品名称 = Value
111
Me.OnPropertyChanged("物品名称")
112
End Set
113
End Property
114
115
Private md_物品型号 As String = String.Empty
116
117
<Browsable(True)> _
118
Public Overridable Property 物品型号()Property 物品型号() As String
119
Get
120
Return md_物品型号
121
End Get
122
Set(ByVal Value As String)
123
124
md_物品型号 = Value
125
Me.OnPropertyChanged("物品型号")
126
End Set
127
End Property
128
129
Private md_单位 As String = String.Empty
130
131
<Browsable(True)> _
132
Public Overridable Property 单位()Property 单位() As String
133
Get
134
Return md_单位
135
End Get
136
Set(ByVal Value As String)
137
138
md_单位 = Value
139
Me.OnPropertyChanged("单位")
140
End Set
141
End Property
142
143
Private md_生产厂家 As String = String.Empty
144
145
<Browsable(True)> _
146
Public Overridable Property 生产厂家()Property 生产厂家() As String
147
Get
148
Return md_生产厂家
149
End Get
150
Set(ByVal Value As String)
151
152
md_生产厂家 = Value
153
Me.OnPropertyChanged("生产厂家")
154
End Set
155
End Property
156
157
Private md_备注 As String = String.Empty
158
159
<Browsable(True)> _
160
Public Overridable Property 备注()Property 备注() As String
161
Get
162
Return md_备注
163
End Get
164
Set(ByVal Value As String)
165
166
md_备注 = Value
167
Me.OnPropertyChanged("备注")
168
End Set
169
End Property
170
171
172
#End Region
173
设置实体的属性#Region "设置实体的属性"
174
175
Public Overrides Sub SetValue()Sub SetValue(ByVal attributename As String, ByVal value As Object)
176
Select Case attributename
177
178
Case "物品编号"
179
物品编号 = value
180
Case "物品名称"
181
物品名称 = value
182
Case "物品型号"
183
物品型号 = value
184
Case "单位"
185
单位 = value
186
Case "生产厂家"
187
生产厂家 = value
188
Case "备注"
189
备注 = value
190
Case Else
191
MyBase.SetValue(attributename, value)
192
End Select
193
End Sub
194
#End Region
195
获取实体的属性#Region "获取实体的属性"
196
197
Public Overrides Function GetValue()Function GetValue(ByVal attributename As String) As Object
198
Select Case attributename
199
200
Case "物品编号"
201
Return 物品编号
202
Case "物品名称"
203
Return 物品名称
204
Case "物品型号"
205
Return 物品型号
206
Case "单位"
207
Return 单位
208
Case "生产厂家"
209
Return 生产厂家
210
Case "备注"
211
Return 备注
212
Case Else
213
Return MyBase.GetValue(attributename)
214
End Select
215
End Function
216
#End Region
217
实体其它属性#Region "实体其它属性"
218
219
<Browsable(False)> _
220
Public ReadOnly Property Guid()Property Guid() As String
221
Get
222
Return "a1ebd1182d4f540e2875efbd38e5b008f"
223
End Get
224
End Property
225
226
<Browsable(False)> _
227
Public Overrides ReadOnly Property TableName()Property TableName() As String
228
Get
229
Return "IMA_物品"
230
End Get
231
End Property
232
233
<Browsable(False)> _
234
Public Overrides ReadOnly Property AutoIncrement()Property AutoIncrement() As IEntityField
235
Get
236
Return _物品编号
237
End Get
238
End Property
239
#End Region
240
End Class
241
实体的容器:
1
Imports
lily
2
Imports
lily.core
3

Public
Class IMA_物品_Container
Class IMA_物品_Container
4
Inherits EntityContainer
5
Public Sub New()Sub New()
6
MyBase.New()
7
End Sub
8
Public Sub New()Sub New(ByVal operate As IMA_物品_Operate)
9
MyBase.New(operate)
10
End Sub
11
Public Shadows Function Add()Function Add(ByVal entity As IMA_物品) As Integer
12
Return MyBase.Add(entity)
13
End Function
14
Default Public Shadows Property Item()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()Function IndexOf(ByVal value As IMA_物品) As Integer
23
Return MyBase.IndexOf(value)
24
End Function
25
Public Shadows Sub Insert()Sub Insert(ByVal index As Integer, ByVal value As IMA_物品)
26
MyBase.Insert(index, value)
27
End Sub
28
Public Shadows Sub Remove()Sub Remove(ByVal value As IMA_物品)
29
MyBase.Remove(value)
30
End Sub
31
Public Shadows Sub AcceptChanges()Sub AcceptChanges(ByVal entityhandler As IMA_物品_Operate)
32
MyBase.AcceptChanges(EntityHandler)
33
End Sub
34
End Class
实体的操作类
1
Imports
lily
2
Imports
lily.core
3

Public
Class IMA_物品_Operate
Class IMA_物品_Operate
4
Inherits EntityHandler
5
公共方法#Region "公共方法"
6
Public Function Create()Function Create(ByVal entity As IMA_物品) As Integer
7
Return Me.InsertObject(entity)
8
End Function
9
Public Function Delete()Function Delete(ByVal entity As IMA_物品) As Integer
10
Return Me.DeleteObject(entity)
11
End Function
12
Public Function Update()Function Update(ByVal entity As IMA_物品) As Integer
13
Return Me.UpdateObject(entity)
14
End Function
15
16
#End Region
17
重写基类方法#Region "重写基类方法"
18
Protected Overrides Function InsertObject()Function InsertObject(ByVal entity As Core.IEntityBase) As Integer
19
Dim en As IMA_物品 = entity
20
Return MyBase.InsertObject(en)
21
End Function
22
23
Protected Overloads Overrides Function DeleteObject()Function DeleteObject(ByVal entity As Core.IEntityBase) As Integer
24
Dim en As IMA_物品 = entity
25
Return MyBase.DeleteObject(en)
26
End Function
27
28
Protected Overloads Overrides Function UpdateObject()Function UpdateObject(ByVal entity As Core.IEntityBase) As Integer
29
Dim en As IMA_物品 = entity
30
Return MyBase.UpdateObject(en)
31
End Function
32
Public Shadows Function GetEntityContainer()Function GetEntityContainer(ByVal command As OQL.ICommand) As IMA_物品_Container
33
Return MyBase.GetEntityContainer(command, GetType(IMA_物品), GetType(IMA_物品_Container))
34
End Function
35
Public Shadows Function GetEntity()Function GetEntity(ByVal expression As Lily.OQL.IExpression) As IMA_物品
36
Return MyBase.GetEntity(expression, New IMA_物品)
37
End Function
38
#End Region
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 _物品名称()
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
总结:此小节主要是介绍了如何把一个数据表转换为一个实体对象,并简单的介绍了如何获取多个实体并绑定和如何更新到数据库。下一节,将介绍如何添加,更新,删除,查询实体对象。