posts - 197,  comments - 504,  trackbacks - 0

使用kbmmw 的ORM 一定先要了解ORM 的对象定义语法。

下面简单说一下

// kbmMW_Table - Define a table.  定义一个表
//   Must be used on classes.
//
//   Define a table named person.
//   [kbmMW_Table('name:person')] 定义表名
//
//   Define 2 ascending indexes i_fieldname, and i_anotherfieldname on the field fieldname and anotherfieldname. 定义正向索引
//   [kbmMW_Table('name:person, index:fieldname, index:anotherfieldname...
//
//   Define an ascending index named i1, on the field name 使用索引名为一个字段定义索引
//   [kbmMW_Table('name:person, index:{name:i1,field:name},...
//
//   Define a descending index named i1, on the field name 定义反向索引
//   [kbmMW_Table('name:person, index:{name:i1,field:name,descending:true},...
//
//   Define a compound unique index named i2, on the fields name and age. Name field part is descending. 定义组合唯一索引
//   [kbmMW_Table('name:person, index:{name:i2,unique:true,fields:[{name:name,descending:true},{name:age}]
//
//   Define method to use when deleting records from a table. Default it will do a regular delete, 定义删除标志,是常规删除还是标志删除
//   but it can be set to flag the record as deleted (which is then automatically respected by
//   queries later on) or it can be set to backup the record before deletion, to another table. 
//   [kbmMW_Table('name:person, defaultDeleteMethod:delete')]  也可以定义为移动到另外一个表里面
//     defaultDeleteMethod can be delete/default, mark or move.
//     If its mark, then deleteMarkProperty must be set to point to a property or field member of the
//     class that should mark the deletion state. Futher deleteMarkValue must be set to the (non null)
//     value indicating a deleted record.
//     If its move, then deleteMoveToTable must be set to the fully scoped name of another defined
//     table, which will hold the backups. Make sure to define the table with similarly named field names.
//     Also add a different main identifier property as primary key.
//
//
// kbmMW_Field - Define fields in a table. 定义表中的字段
//   Must be used on properties within a class if they are to be persisted.
//
//   Define a field that will be persisted. Its type will be decided for
//     from the property type. String type fields will have a size of 50.
//     Table field name will be the same as the property name.
//   [kbmMW_Field] 字段标识
//
//   Define a field that will be persisted. It will accept unicode data of max 50 characters.
//     It will have the same name as the property.
//   [kbmMW_Field(ftWideString,50)] 长度为50的字符类型
//
//   Define a field named id, and make it primary key. It will be automatically populated bu the generator shortGuid.
//   [kbmMW_Field('name:id, primary:true, generator:shortGuid',ftString,40)] 定义字段名称、类型、长度,自动生成属性
//   property ID:kbmMWNullable<string> read FID write FID;
//  四种自动生成类型
//   These generators exists:
//     GUID           - Returns a GUID formatted as a regular GUID {123e4567-e89b-12d3-a456-426655440000}
//     SHORTGUID      - Returns a short GUID where braces and dashes are missing: 123e4567e89b12d3a456426655440000
//     SEQUENCE       - Returns next unique number from a sequence. Provide name of sequencer in sequence property
//                      and optional sequencestart property (not supported by all databases!)
//     DATETIME       - Returns a date time value, formatted according to the dateFormat property.

// // Define a field named id, and make it primary key. It will be populated by a sequence generator. // Since no sequencer was given, one is automatically generated named s_tablename_fieldname // [kbmMW_Field('name:id, primary:true, generator:sequence',ftInteger)] 定义字段为主键,并自动用序列生成 // property ID:kbmMWNullable<integer> read FID write FID; // // Define a field named id, and make it primary key. It will be populated by sequence generator SEQ, starting from value 10. // (not all databases supports sequencers with a defined start!) 从10开始,定义序列 // [kbmMW_Field('name:id, primary:true, generator:sequence, seqneuce:SEQ1, sequenceStart:10',ftInteger)] // property ID:kbmMWNullable<integer> read FID write FID; 属性定义,与字段名相同 // // Define a field named id, and make it primary key. It will be populated automatically by the database. // (not all databases support auto increment type fields!) // [kbmMW_Field('name:id, primary:true',ftAutoInc)] 定位为自增长 // property ID:kbmMWNullable<integer> read FID write FID; // // Define a field named datetime containing date/time values as Delphi local time values. // [kbmMW_Field('name:datetime',ftDateTime)] 定义为日期字段 // property DateTime:TkbmMWDateTime read FDateTime write FDateTime; // // Define a field named datetime containing date/time values as Delphi UTC values. // [kbmMW_Field('name:datetime, dateFormat:UTC',ftDateTime)] 使用UTC 日期 // property DateTime:TkbmMWDateTime read FDateTime write FDateTime; // // Define a field named datetime containing date/time values as Unix local time millisecs since EPOC. // [kbmMW_Field('name:datetime, dateFormat:LOCALSINCEEPOCHMS',ftInt64)] 使用unix 当地日期,毫秒计时 // property DateTime:TkbmMWDateTime read FDateTime write FDateTime; // // Define a field named datetime containing date/time values as Unix UTC time millisecs since EPOC. // [kbmMW_Field('name:datetime, dateFormat:UTCSINCEEPOCHMS',ftInt64)]使用unix UTC日期,毫秒计时 // property DateTime:TkbmMWDateTime read FDateTime write FDateTime; // // Define a field named datetime containing date/time values as Unix local time secs since EPOC. // [kbmMW_Field('name:datetime, dateFormat:LOCALSINCEEPOCH',ftInt64)]使用unix 当地日期,秒计时 // property DateTime:TkbmMWDateTime read FDateTime write FDateTime; // // Define a field named datetime containing date/time values as Unix UTC time secs since EPOC. // [kbmMW_Field('name:datetime, dateFormat:UTCSINCEEPOCH',ftInt64)]使用unix TUC日期,秒计时 // property DateTime:TkbmMWDateTime read FDateTime write FDateTime; // // Define a field named datetime containing date/time values as ISO8601 formatted string. // [kbmMW_Field('name:datetime, dateFormat:ISO8601',ftString,50)] ISO08601 日期 // property DateTime:TkbmMWDateTime read FDateTime write FDateTime; // // Define a field named datetime containing date/time values as RFC1123 formatted string. // [kbmMW_Field('name:datetime, dateFormat:RFC1123',ftString,50)] RFC1123 日期 // property DateTime:TkbmMWDateTime read FDateTime write FDateTime; // // Define a field named datetime containing date/time values as NCSA formatted string. // [kbmMW_Field('name:datetime, dateFormat:NCSA',ftString,50)] NCSA 日期 // property DateTime:TkbmMWDateTime read FDateTime write FDateTime; // // kbmMW_Null - Specify NULL conversion. // (This attribute is also used for object marshalling). // // If, for example, a property is of type integer, the property is not directly able to indicate a NULL state since // all values of an integer are considered non NULL values. // However its possible to define a specific value to be interpreted as NULL. // Eg. // [kbmMW_Field('name:somefield',ftInteger)] // [kbmMW_Null(-1)] 定义-1 为空 // property MyProperty:integer read FMyProperty write FMyProperty; // // This will define that the value -1 must be interpreted as NULL when storing and retrieving data // from the database. // // kbmMW_NotNull - Indicate that the property must never contain the NULL value (either interpreted via the kbmMW_Null attribute or actual). // Eg. // [kbmMW_Field('name:somefield',ftInteger)] 字段不准为空 // [kbmMW_NotNull] // property MyProperty:kbmMWNullable<integer> read FMyProperty write FMyProperty;
以下为实际的定义,请大家认真理解

[kbmMW_Table('name:person, index:{name:i1,field:name,descending:false}, index:{name:i2,unique:true,fields:[{name:name,descending:true},{name:age}]')] TPerson = class private FID:kbmMWNullable<string>; FName:kbmMWNullable<string>; FAddress:kbmMWNullable<string>; FAge:kbmMWNullable<integer>; public [kbmMW_Field('name:id, primary:true, generator:shortGuid',ftString,40)] property ID:kbmMWNullable<string> read FID write FID; [kbmMW_Field('name:name',ftWideString,50)] property FullName:kbmMWNullable<string> read FName write FName; [kbmMW_Field('name:address',ftWideString,50)] property Address:kbmMWNullable<string> read FAddress write FAddress; [kbmMW_Field('name:age',ftInteger)] property Age:kbmMWNullable<integer> read FAge write FAge; end; [kbmMW_Table('name:account')] TAccount = class private FID:kbmMWNullable<string>; FPersonID:string; FName:kbmMWNullable<string>; FValue:double; public [kbmMW_Field('name:id, primary:true, generator:shortGuid',ftString,40)] [kbmMW_NotNull] property ID:kbmMWNullable<string> read FID write FID; [kbmMW_Field('name:personid',ftString,40)] [kbmMW_NotNull] [kbmMW_Null('')] property PID:string read FPersonID write FPersonID; [kbmMW_Field('name:name, default:"Unknown"',ftString,30)] [kbmMW_NotNull] property Name:kbmMWNullable<string> read FName write FName; [kbmMW_Field] [kbmMW_Null(Math.NaN)] property Value:double read FValue write FValue; end; [kbmMW_VirtualTable(TAccount)] TAccountWithPerson = class(TAccount) private FPerson:TPerson; public destructor Destroy; override; [kbmMW_VirtualField('name:person, source:uData.TPerson, key:PID, sourceKey:ID')] property Person:TPerson read FPerson write FPerson; end; [kbmMW_VirtualTable(TAccount)] TAccountWithPersonName = class(TAccount) private FFullName:kbmMWNullable<string>; public // [kbmMW_VirtualField('name:fullName, source:uData.TPerson, key:PID, sourceKey:ID, value:uData.TPerson.FullName')] [kbmMW_VirtualField('name:fullName, source:uData.TPerson, key:PID, sourceKey:ID, value:"uData.TPerson.FullName||\" Age:\"||uData.TPerson.Age"')] property FullName:kbmMWNullable<string> read FFullName write FFullName; end; [kbmMW_VirtualTable(TPerson)] TPersonWithAccounts = class(TPerson) private FAccounts:TObjectList<TAccount>; public destructor Destroy; override; [kbmMW_VirtualField('name:accounts, source:uData.TAccount, key:ID, sourceKey:PID')] property Accounts:TObjectList<TAccount> read FAccounts write FAccounts; end; // [kbmMW_Table('name:image, defaultDeleteMethod:mark, deleteMarkProperty:Deleted, deleteMarkValue:true')] [kbmMW_Table('name:image, defaultDeleteMethod:move, deleteMoveToTable:uData.TBackupImage')] TImage = class private FID:kbmMWNullable<string>; FDescription:kbmMWNullable<string>; FPersonID:string; FBlob:TMemoryStream; FDeleted:boolean; protected procedure SetBlob(AValue:TMemoryStream); virtual; public constructor Create; virtual; destructor Destroy; override; [kbmMW_Field('name:id, primary:true, generator:shortGuid',ftString,40)] [kbmMW_NotNull] property ID:kbmMWNullable<string> read FID write FID; [kbmMW_Field('name:personid',ftString,40)] [kbmMW_NotNull] [kbmMW_Null('')] property PID:string read FPersonID write FPersonID; [kbmMW_Field('name:description',ftString,30)] property Description:kbmMWNullable<string> read FDescription write FDescription; [kbmMW_Field('name:blob',ftGraphic)] [kbmMW_NotNull] property Blob:TMemoryStream read FBlob write SetBlob; [kbmMW_Field('name:deleted',ftBoolean)] [kbmMW_NotNull] property Deleted:boolean read FDeleted write FDeleted; end; [kbmMW_Table('name:backupImage')] TBackupImage=class(TImage) private FBackupID:kbmMWNullable<string>; public // [kbmMW_Field('name:backupId, primary:true, generator:shortGuid',ftString,40)] // [kbmMW_NotNull] // property BackupID:kbmMWNullable<string> read FBackupID write FBackupID; // [kbmMW_Field('name:id, primary:true',ftString,40)] [kbmMW_NotNull] property ID:kbmMWNullable<string> read FID write FID; end; [kbmMW_VirtualTable] TPersonAccount = class private FID:string; FName,FAccountName:kbmMWNullable<string>; FValue:double; public [kbmMW_Field('name:id')] property ID:string read FID write FID; [kbmMW_Field('name:name')] property Name:kbmMWNullable<string> read FName write FName; [kbmMW_Field('name:accountName')] property AccountName:kbmMWNullable<string> read FAccountName write FAccountName; [kbmMW_Field('name:value')] property Value:double read FValue write FValue; end; [kbmMW_Table('name:person2')] TPerson2 = class private FID:kbmMWNullable<string>; FName:kbmMWNullable<string>; FAddress:kbmMWNullable<string>; FAge:kbmMWNullable<integer>; FAccounts:TObjectList<TAccount>; public constructor Create; virtual; destructor Destroy; override; [kbmMW_Field('name:id, primary:true, generator:shortGuid',ftString,40)] property ID:kbmMWNullable<string> read FID write FID; [kbmMW_Field('name:name',ftWideString,50)] property Name:kbmMWNullable<string> read FName write FName; [kbmMW_Field('name:address',ftWideString,50)] property Address:kbmMWNullable<string> read FAddress write FAddress; [kbmMW_Field('name:age',ftInteger)] property Age:kbmMWNullable<integer> read FAge write FAge; [kbmMW_Field('join:{source:ID,dest:PersonID}')] property Accounts:TObjectList<TAccount> read FAccounts; end;


东西真多,什么时候可以可视化设计就好了。
posted on 2018-06-17 13:10 xalion 阅读(...) 评论(...) 编辑 收藏