Here's the full model:
TChiamata = class;
TChiamataDett = class;
TFarmacia = class;
TTipoChiamata = class;
[Entity]
[Model('Chiamate')]
[Table('ChiamataDett')]
[Sequence('SEQ_CHIAMATA_ID')]
[Inheritance(TInheritanceStrategy.SingleTable)]
[DiscriminatorColumn('DISCR', TDiscriminatorType.dtInteger)]
[Id('FID', TIdGenerator.IdentityOrSequence)]
TChiamata = class
private
[Column('ID', [TColumnProp.Required])]
FID: integer;
[Association([TAssociationProp.Required], CascadeTypeAll - [TCascadeType.Remove])]
[JoinColumn('IDTipologia', [TColumnProp.Required], 'ID')]
FTipoChiamata: TTipoChiamata;
[Column('GUID', [TColumnProp.Required])]
FGUID: string;
[Column('TS', [TColumnProp.Required])]
FTS: TDateTime;
[Column('DataOra', [TColumnProp.Required])]
FDataOra: TDateTime;
public
procedure destroyTipoChiamata;
property ID: integer read FID write FID;
property TipoChiamata: TTipoChiamata read FTipoChiamata write FTipoChiamata;
property GUID: string read FGUID write FGUID;
property TS: TDateTime read FTS write FTS;
property DataOra: TDateTime read FDataOra write FDataOra;
end;
[Entity]
[Model('Chiamate')]
// [Table('ChiamataDett')]
// [Sequence('SEQ_CHIAMATA_ID')]
// [Id('FID', TIdGenerator.IdentityOrSequence)]
[DiscriminatorValue(0)]
TChiamataDett = class(TChiamata)
private
[Column('Descrizione', [TColumnProp.Required], 1000)]
FDescrizione: string;
[Association([TAssociationProp.Required], CascadeTypeAll - [TCascadeType.Remove])]
[JoinColumn('IDFarmacia', [TColumnProp.Required], 'ID')]
FFarmacia: TFarmacia;
public
procedure destroyFarmacia;
property Descrizione: string read FDescrizione write FDescrizione;
property Farmacia: TFarmacia read FFarmacia write FFarmacia;
end;
[Entity]
[Table('Farmacia')]
[Model('Chiamate')]
[Sequence('SEQ_FARMACIA_ID')]
[Id('FID', TIdGenerator.IdentityOrSequence)]
TFarmacia = class
private
[Column('ID', [TColumnProp.Required])]
FID: integer;
[Column('Nome', [TColumnProp.Required], 50)]
FNome: string;
[Column('Citta', [TColumnProp.Required], 50)]
FCitta: string;
[Column('Telefono', [TColumnProp.Required], 15)]
FTelefono: string;
[Column('GUID', [TColumnProp.Required], 40)]
FGUID: string;
public
property ID: integer read FID write FID;
property Nome: string read FNome write FNome;
property Citta: string read FCitta write FCitta;
property Telefono: string read FTelefono write FTelefono;
property GUID: string read FGUID write FGUID;
end;
[Entity]
[Model('Chiamate')]
[Table('TipoChiamata')]
[Id('FID', TIdGenerator.None)]
TTipoChiamata = class
private
[Column('ID', [TColumnProp.Required])]
FID: integer;
[Column('Descrizione', [TColumnProp.Required], 50)]
FDescrizione: string;
public
property ID: integer read FID write FID;
property Descrizione: string read FDescrizione write FDescrizione;
end;
This is the class that handles any request from server to client and an enumeration to set the RestMethod:
TRestMethod = (rmPOST,rmGET,rmPUT,rmDELETE);
TRestClient = class
private
FRestMethod: TRestMethod;
FXDataClient: TXDataClient;
procedure setReturnedInstancesOwnership(const Value: boolean);
public
constructor create(Method: TRestMethod);
destructor Destroy; override;
function getObject<T: class, constructor>(AID: integer): T;
function getList<T:Class,constructor>(prop: string): TList<T>;
procedure execute(AObject: TObject);
function generateGUID: string;
function getChiamataDettByGUID(AGUID: string): TChiamataDett;
function getFarmaciaByGUID(AGUID: string): TFarmacia;
function getFarmaciaByNome(AFiltro: string): TList<TFarmacia>;
function getChiamataByData(ADataI, ADataF: TDateTime): TList<TChiamata>;
function getChiamataByDescrizione(AString: string): TList<TChiamata>;
function getChiamataByFarmacia(AID: integer): TList<TChiamata>;
function getChiamataByTipologia(AParams: string): TList<TChiamata>;
function verificaChiamataDett(AID: integer; ATS: TDateTime): integer;
property RestMethod: TRestMethod read FRestMethod write FRestMethod;
property XDataClient: TXDataClient read FXDataClient write FXDataClient;
property ReturnedInstancesOwnership: boolean write
setReturnedInstancesOwnership;
end;
and this is the procedure on client side that performs a request to the server:
procedure TRestClient.execute(AObject: TObject);
begin
case FRestMethod of
rmPOST:
FXDataClient.Post(AObject);
rmPUT:
FXDataClient.Put(AObject); //causes problems
rmDELETE:
FXDataClient.Delete(AObject);
end;
end;
in particular, on server side, in Aurelius.Engine.ObjectManager, in procedure TObjectManager.PerformUpdate(Entity: TObject; ChangedColumns: TList<string>) on this point
Entry := FObjects.GetEntry(Entity);
// Prepare old state for events
if Events.OnUpdated.HasListeners then
begin
PreviousOldState := TObjectState.Create;
for Pair in Entry.OldState.Values do //ERROR ACCESS VIOLATION
PreviousOldState.Values.Add(Pair.Key, Pair.Value);
end;
I get error every time I try to perform an update on TChiamataDett and when the access violation is thrown it is working on TFarmacia, trying to update it, but when it arrives at
for Pair in Entry.OldState.Values do
Entry.OldState is set as nil and I get error