1、ECO_TYPE:提供了每个业务逻辑类对应的独特类型ID
2、ECOMODELROOT:维护了每一个对象ID属于的类型ID
3、ECO_ID:下一个对象将要增加的对象ID
4、ECO_TABLES:ECO业务逻辑产生的模型数据表名的罗列。
5、ECO_ORMAPPING:只有一笔数据就是Mapping规则。
先从最基本的ECO类的元素字段说起:
Category作为一个类,含有三个元素。当选中一个元素,那么该元素有属性:
Comments大项:注释
Name:名称
Alias:别名
Has user code:
Type:该字段的类型。AutoInc代表自动增加的类型
Visible:代表是那种可见类型(public/private/protected/package)
也可以直接在该字段的字符串加以下符号修饰:
+ public
- private
/ derived(下图中的TopicCount字段)
* protected
Persistence大项:代表影射到数据库(称为持久化后)的选项。
Allow null:允许空么?
Delayed fetch:延迟获取?
Derivation OCL:派生属性的派生OCL表达示
Derived:派生属性么?如果是派生属性,需要在Derivation OCL填充内容。
Derived settable:需要将派生属性设置为表字段么?一般选FALSE。
Length
Save Action:保存的行为。Free/None/Dbassign,其中DBASSIGN代表由数据库来决定存储方式。比如前面的Type选择AUTOINC,那么就要选择这个DBASSIGN来设置该字段自动加一的属性。
介绍完了字段,那么我们看元素的构成物类:
Comments同前
General中:abstract:是抽象类么?
Alias:别名
Constains:对类中某些字段条件的限制,是个集合,可以写多个条件,可以由OCL撰写。比如对密码长度的限制等。
Interfaces:
Sealed:是否不可以被继承的?
Stereotype:
Locking 中:Generate Default:
Optimistic Locking:
四、基本操作:
4.1增加表的一条记录(实质:插入一个ECO对象,并且更新到数据库):
var
objTopic : Topic;//是ECO空间的对象
obj1:IobjectList;//用来转化IElement的对象列(Element as obj1 )
obj:System.&Object;//取出对象列的首个作为操作对象
begin
try
objTopic :=Topic.create(Ecospace);//rhRoot.Element.AsObject as Topic; //创建ECO对象
objTopic.ForumID:=1;
objTopic.UserID:=1;
objTopic.UserName:='wangzheng';
objTopic.PostsNo:=1;
objTopic.LastPosted:=Datetime.Now;
objTopic.LastUserName:='yangtang';
objTopic.LastUserID:=12;
objTopic.LastMessageID:=1;
objTopic.PostedTime:=Datetime.Now;
///用来获得一个关联的元素作为关系字段的填充
///
obj:=ForumHandle.Element.GetAsCollection.Item[0].asobject;
// ForumHandle为Forum.allInstances的数据集expressionhandle
objTopic.postedAt:=obj as Forum;
Ecospace.UpdateDatabase;
except on E:Exception do
MessageBox.Show('错误'+e.ToString);
end;
end;
4.2删除记录
对于数据库的一条记录,在eco中是视作一个对象的。在需要删除一条记录时,应先找到该对象,再进行删除 。 比如:person.AsIObject.delete 表示删除当前person记录如果是在一个名为ehperson的expressionHandle中,则可这样
ehperson.element.getascollection.removeat(recordno记录号),而不能象原来我们在delphi中做的用person.free或person:=nil来解决。因为这根本不对数据库进行操作。
范例
4.2.1 对一条记录删除
TopicHandle.Element.GetAsCollection.removeat(1);
ecospace.UpdateDatabase;
OR
//删除记录
DataGrid SourceGrid = source as DataGrid;
string Id = SourceGrid.DataKeys[e.Item.ItemIndex].ToString();
IObject ToDelete = ObjectForId(Id);
if (ToDelete!=null)
ToDelete.Delete();
UpdateDatabase();
DataBind();
4.2.2对整个表的记录完全删除:
var list1:ielementcollection;
begin
...
list1 := ehfx.element.GetAsCollection;
for I := List1.Count - 1 downto 0 do
begin
afx := fxbb(list1.item[i].asobject);
if assigned(afx) then
afx.AsIObject.Delete;
end;
fecospace.UpdateDatabase;
DataBind;
4.2.3 更新操作:
其实直接的对一个ehandle直接赋值即可以用updatedatebase更新
//更新操作
DataGrid SourceGrid = source as DataGrid;
string Id = SourceGrid.DataKeys[e.Item.ItemIndex].ToString();
SourceGrid.DataBind(); // To set DataSource
ElementHandle Eh = SourceGrid.DataSource as ElementHandle;
Object Row = Eh.RenderElement(ObjectForId(Id));
for (int colIndex = 0; colIndex< SourceGrid.Columns.Count;colIndex++)
{
if (!(SourceGrid.Columns[colIndex] is BoundColumn))
continue;
BoundColumn Col = (BoundColumn)SourceGrid.Columns[colIndex];
if (Col!=null && !Col.ReadOnly)
Eh.SetRenderedElementProperty(Row, Col.DataField, (e.Item.Cells[colIndex].Controls[0] as TextBox).Text, true);
}
UpdateDatabase();