Subproperties

with TStringField.Create(Self) do

begin

  FieldName := 'Country.Name';

  Dataset := AureliusDataset1;

end;

and

  [Association([], [])]
    [JoinColumn('LicenseID', [], 'LicenseID')]
    [Description('')]
    FCountry: TCountry;


What happens if the property COUNTRY is not assigned, because it allows NULL?

Accessign via FieldByName('country.name').asstring leads to an AV for me.

It should be handled smoothly by the dataset. If Country is nil, FieldByName().AsString would return an empty string.

Hmm. This
adsSoftware.entityfieldbyname('licenseid').AsEntity<TLicense>.Description
leeds to an AV when licenseid is not assigned, otherwise it is ok.

This
 adsSoftware.fieldbyname('licenseid.description').AsString
always leads to "field ... not found".
It's expected, as you are retrieving a TLicense instance using AsEntity, and *then* you are trying to access the Description property. You'd have to check if AsEntity<TLicense> is nil first.

In this case you have to create the licenseid.description field. If it's not created, you get that message. Isn't it your field "licenseiddescrition"?
You can also set 

adsSoftware.SubPropsDepth := 1;

To ask for dataset to create all those sub properties fields automatically for you.