Вы можете применить это отношение автоматически на уровне базы данных, используя составной ключ. Однако вы не сможете использовать guid s. Если использование направляющих является требованием для вашей проблемы, то это решение вам не пригодится.
Решение, показанное ниже, будет работать с любой реляционной базой данных без дополнительного кода:
create table party (
id int primary key not null
);
create table contract (
party_id int not null,
contract_no int not null,
primary key (party_id, contract_no),
constraint fk1 foreign key (party_id) references party (id)
);
create table damage (
id primary key not null,
party_id int not null, -- not nullable
contract_no int, -- nullable
constraint fk2 foreign key (party_id) references party (id),
constraint fk3 foreign key (party_id, contract_no)
references contract (party_id, contract_no)
);
Примечание: Стандарт SQL определяет три варианта соответствия для частично нулевых FK (нет, частично, полностью), но каждая база данных позволяет использовать любой из них.