Why does SSDT deploy inline FK Constraint as WITH NOCHECK? Given the following Foreign Key Constraint definition inline of a Create Table definition in a SSDT project:

CREATE TABLE A
(...Columns...),
CONSTRAINT [FK_O] FOREIGN KEY ([OID]) REFERENCES [dbo].[O] ([ID]) ON DELETE CASCADE NOT FOR REPLICATION,
(...)


and the following quote from MSDN


  WITH CHECK | WITH NOCHECK
  Specifies whether the data in the table is or is not validated against a newly added or re-enabled FOREIGN KEY or CHECK constraint. If not specified, WITH CHECK is assumed for new constraints, and WITH NOCHECK is assumed for re-enabled constraints.


, I wonder why the FIRST deployment result of this NEW table does look like that using a constraint WITH NOCHECK option as follows:

ALTER TABLE [dbo].[A]  WITH NOCHECK ADD CONSTRAINT [FK_O] FOREIGN KEY([OID])
REFERENCES [dbo].[O] ([ID])
ON DELETE CASCADE
NOT FOR REPLICATION 
GO

ALTER TABLE [dbo].[A] CHECK CONSTRAINT [FK_O]
GO


So the question is, shouldn't the inline Constraint definition that does not allow to define "with Nocheck" paired with the rule from the MSDB page result into a constraint using the WITH CHECK option on this NEW table? Why do we get a WITH NOCHECK Constraint here?
There is only one kind of foreign key constraint (though it can be trusted, or untrusted).

If it was a new table, both code paths are essentially the same. But they do it this way because SSDT is taking into account it might need to tweak the DDL to add to an existing table. 


If the table existed and it altered the table with check, the deployment will fail and will not put a check constraint on the table.
If the table existed and it altered the table with nocheck, leaving the check for afterwards, you'll get an error if old data doesn't meet the criteria, but at least the schema change will be in place.


What they've done is generate a consistent set of code that covers both non-existing and existing possibilities. They haven't tried to optimise for every use case. 

Essentially it has no further inherent meaning. It's just an artefact of how they output the code.