You are not logged in.
Pages: 1
Having problem finding out how I should handle INSERT of objects that contains linked classes.
ORMAdd does not seems to handle that.
I came up with an own solution but don't really like it.
The main TSQLRecord looks like this:
TSQLRecordCustomer = class(TSQLRecord)
protected
fContact: TSQLRecordPersonContactable; <<<--- The linked class
published
property Contact: TSQLRecordPersonContactable read fContact write fContact;
The repositorys add-function:
function TCustomerRepository.Add(const aAggregate: TCustomer): TCQRSResult;
var
rest: TSQLRest;
SQLpc: TSQLRecordPersonContactable;
pc: TPersonContactable;
SQLcus: TSQLRecordCustomer;
begin
result := cqrsInternalError;
rest := GetRest(self);
SQLpc := TSQLRecordPersonContactable.Create;
SQLcus := TSQLRecordCustomer.Create;
CustomerToRecord(aAggregate,SQLcus,SQLpc); <<<---- Copies all fields from TCustomer into SQLcus and SQLpc
SQLcus.Contact := TSQLRecordPersonContactable(rest.add(SQLpc, true));
rest.Add(SQLcus, true);
result := cqrsSuccess;
This works but I don't know how to handle different errors here and the "CustomerToRecord" function is heavy to type.
What I want is that this should be enough.
Result := ORMAdd(aAggregate);
But this leaves the "Contact"-field equal to zero.
I'm afraid that it isn't possible using ORM this way but hopes for a simpler and better solution than mine.
Last edited by larand54 (2020-05-11 06:14:45)
Delphi-11, WIN10
Offline
You are making your code from the wrong way round.
Confusing TSQLRecord and the ORM aggregate class.
The DDD ORM won't start from a TSQLRecord, but from an aggregate class. Then it would create nested classes into TSQLRecord fields.
For instance, with a nested Name: TPersonName property in TPerson, TPerson.Name.First will be persisted as TSQLPerson.Name_First field - with no nested TSQLRecord.
It will flatten the TPerson class into a TSQLPerson, and create a SQL column for each TPerson nested field. On MongoDB, it will just use a nested object.
Please read the doc and samples again.
Offline
Ok, from the beginning I did just that but I did not want a complete flat table, I want to split them in One Customer table and one PersonContactable table.
In this simple example it isn't needeed but I want to know how to behave when I really need to split.
In one case I can think of is when you have several contacts for the customer. They are specified by what "role" that contact have. Different customers has different roles One may have only one another has 3 and others may have 6 etc. In that case it feels inconvenient to have a flat table for all this even if its possible.
One contact can possess several roles, the customer employs a new person to take over another contacts role etc.
Last edited by larand54 (2020-05-11 10:32:02)
Delphi-11, WIN10
Offline
Pages: 1