Это довольно физиологично.
Я бы предложил использовать DTO, где не проверяются никакие ограничения (в основном, где вы можете принимать «все виды данных» в ваших установщиках или даже иметь открытые свойства, которыеменее громоздким) и иметь проверку на него.
Когда DTO действителен, создайте базовый объект в допустимом состоянии (Value Object?)
Конечно, вам нужно «продублировать»«некоторые ограничения, но я бы не рассматривал это как реальное дублирование, потому что, фактически, DTO и базовый объект не являются одним и тем же объектом , даже если они кажутся связанными.Если вы не согласны - и это может иметь место - просто остановитесь и подумайте о том усилении, которое вы получите, отсоединив сущность (которая должна быть всегда в действительном состоянии) от модели, где принимаются пользовательские входные данные.