delphi orm支持枚举类型吗?

delphi orm支持枚举类型吗?,delphi,orm,Delphi,Orm,是否支持枚举类型,或者假设它支持,如何使用枚举类型 在“Helloworld”示例中,我添加了一个简单的TGender类型: type TGender = (gtMale, gtFemale); [Entity('CUSTOMERS')] TCustomer = class private FName: String; FEMail: String; FID: Integer; FCreatedAt: TDate; FADDRESS: S

是否支持枚举类型,或者假设它支持,如何使用枚举类型

在“Helloworld”示例中,我添加了一个简单的TGender类型:

type
  TGender = (gtMale, gtFemale);

  [Entity('CUSTOMERS')]
  TCustomer = class
  private
    FName: String;
    FEMail: String;
    FID: Integer;
    FCreatedAt: TDate;
    FADDRESS: String;
    FGender: TGender;
    procedure SetADDRESS(const Value: String);
    procedure SetCreatedAt(const Value: TDate);
    procedure SetEMail(const Value: String);
    procedure SetGender(const Value: TGender);
    procedure SetID(const Value: Integer);
    procedure SetName(const Value: String);
  public
    property ID: Integer read FID write SetID;
    property Name: String read FName write SetName;
    property Address: String read FADDRESS write SetADDRESS;
    property EMail: String read FEMail write SetEMail;
    [Column('CREATED_AT')]
    property CreatedAt: TDate read FCreatedAt write SetCreatedAt;
    property Gender: TGender read FGender write SetGender;
  end;
对于简单的插入:

procedure SimpleInsert;
var
  dormSession: TSession;
  Customer: TCustomer;
begin
  dormSession := TSession.CreateConfigured(
    TStringReader.Create(Form1.Memo1.Lines.Text), TdormEnvironment.deDevelopment);
  try
    Customer := TCustomer.Create;
    Customer.Name := 'Daniele Teti Inc.';
    Customer.Address := 'Via Roma, 16';
    Customer.EMail := 'daniele@danieleteti.it';
    Customer.CreatedAt := Now;
    Customer.Gender := gtMale;
    dormSession.Insert(Customer);
    Customer.Free;
  finally
    dormSession.Free;
  end;
end;
结果是性别为空:

(性别定义为整数)

加载记录时,dorm报告错误:


“未知性别字段类型”

查看源代码时,它似乎不存在。(至少对于SQLite适配器)

无论如何,这部分的源代码很容易理解和修改

以下是我为添加对枚举的支持所做的更改:

dorm.utils
中:

function TdormUtils.GetFieldType
...
  else if (_PropInfo.Kind = tkEnumeration) and (_PropInfo.Name = 'Boolean') then
    Result := 'boolean'
  else if _PropInfo.Kind = tkEnumeration then
    Result := 'integer'
...
dorm.adapter.Sqlite3
中:

procedure TSqlite3PersistStrategy.LoadObjectFromSqliteTable(...);
var
  PropTypeInfo: PTypeInfo;
...
begin
...
      else if CompareText(field.FieldType, 'integer') = 0 then
      begin
        if (Field.RTTICache.RTTIProp <> nil) and
           (Field.RTTICache.RTTIProp.PropertyType.TypeKind = tkEnumeration) then
        begin
          PropTypeInfo := Field.RTTICache.RTTIProp.PropertyType.Handle;
          v := TValue.FromOrdinal(PropTypeInfo,
            AReader.FieldAsInteger(AReader.FieldIndex[field.FieldName]));
        end
        else
          v := AReader.FieldAsInteger(AReader.FieldIndex[field.FieldName]);
        S := field.FieldName + ' as integer';
      end
...
end

procedure TSqlite3PersistStrategy.SetSqlite3ParameterValue(...);

begin
...
  else if CompareText(aFieldType, 'integer') = 0 then
  begin
    if aValue.Kind = tkEnumeration then
    begin
      ADB.AddParamInt(aParameterName, aValue.AsOrdinal);
      GetLogger.Debug(aParameterName + ' = ' + IntToStr(aValue.AsOrdinal));
    end
    else
    begin
      ADB.AddParamInt(aParameterName, aValue.AsInteger);
      GetLogger.Debug(aParameterName + ' = ' + IntToStr(aValue.AsInteger));
    end;
  end
...
end
过程TSqlite3PersistStrategy.LoadObjectFromSqliteTable(…);
变量
PropTypeInfo:PTypeInfo;
...
开始
...
否则,如果CompareText(field.FieldType,'integer')=0,则
开始
如果(Field.RTTICache.RTTIProp nil)和
(Field.RTTICache.RTTIProp.PropertyType.TypeKind=tkEnumeration)然后
开始
PropTypeInfo:=Field.RTTICache.RTTIProp.PropertyType.Handle;
v:=TValue.FromOrdinal(PropTypeInfo,
AReader.FieldAsInteger(AReader.FieldIndex[field.FieldName]);
结束
其他的
v:=AReader.FieldAsInteger(AReader.FieldIndex[field.FieldName]);
S:=field.FieldName+'作为整数';
结束
...
结束
过程TSqlite3PersistStrategy.SetSqlite3ParameterValue(…);
开始
...
否则,如果CompareText(aFieldType,'integer')=0,则
开始
如果aValue.Kind=tkEnumeration,则
开始
ADB.AddParamInt(aParameterName,aValue.AsOrdinal);
调试(aParameterName+'='+IntToStr(aValue.AsOrdinal));
结束
其他的
开始
ADB.AddParamInt(aParameterName,aValue.AsInteger);
调试(aParameterName+'='+IntToStr(aValue.AsInteger));
结束;
结束
...
结束

在数据库中,字段应该声明为整数。

该存储库中很少提到枚举:TGender没有定义为整数类型!TGender定义为枚举类型。授权Delphi为每个枚举类型成员分配一个序号值,然后在分配或检索这些值时在内部使用该序号值。但这并不意味着它是一个整数type@SilverWarior:我的意思是在数据库中。