Вообще говоря, ваши классы контрактов данных должны быть очень легкими объектами передачи данных без какой-либо логики или более глубокого значения, прикрепленного к ним. Просто контейнеры для передачи данных через облако. Это должны быть открытые классы, имеющие только набор открытых свойств для чтения и записи. В ваших классах бизнес-логики вы должны конвертировать их в некоторые внутренние бизнес-объекты и делать обратное при передаче данных.
Это отделяет модель передачи данных от любой внутренней модели сущности и обеспечивает оптимальную ремонтопригодность, позволяя вам избежать проблем, таких как та, с которой вы сталкиваетесь - когда проблемы проектирования ОО конфликтуют с рабочим поведением WCF.
С очень маленькими проектами затраты на сохранение отдельной модели могут не стоить этого. AutoMapper может помочь в минимизации ручного труда.
Говоря о вашем конкретном сценарии, я не уверен, что точно понимаю формулировку проблемы. Вы не хотите, чтобы какое-то поле было изменено? Но это поле является лишь частью модели данных - части модели данных никогда не «модифицируются» - здесь нет «старых» данных, только данные, которые составляет ваш клиент. Ваш клиентский код просто отправляет объект данных на сервер. Если сервер не заботится об одном члене класса, он должен просто игнорировать его.
Не похоже, что экземпляры объектов контракта данных существуют на сервере и ждут, когда клиенты манипулируют ими. Поле «только для чтения» может концептуально иметь смысл в таком сценарии, но это не так с WCF. Клиент просто составляет объект и отправляет его на сервер. Если вы не хотите, чтобы сервер прослушивал некоторые данные, либо не добавляйте их в модель данных, либо (если, возможно, это иногда требуется, только для определенных пользователей или тому подобное), заставьте сервер игнорировать их, когда это нежелательно.