Если я не ошибаюсь, люди обычно не выставляют свои объекты Entity Framework непосредственно в сервисе WCF.Entity Framework обычно рассматривается как уровень доступа к данным, а WCF - это скорее интерфейсный уровень, поэтому они размещаются на разных уровнях.
Объект передачи данных (DTO) используется в методах WCF.Как правило, это POCO, который вообще не отслеживает состояние.Затем DTO сопоставляется с сущностью либо вручную, либо с помощью структуры, такой как AutoMapper.
Обычно клиенты должны знать, «добавляют» ли они или «обновляют» объект, и я лично предпочел бы, чтобы их было дваотдельные операции на интерфейсе сервиса.Кроме того, я бы определенно потребовал бы, чтобы они использовали отдельный метод для удаления объекта.Однако, если вам абсолютно необходимо общее «Сохранить», вы должны быть в состоянии определить, является ли данный вам объект «новым» или нет, основываясь на наличии (или отсутствии) значения первичного ключа.
Большая часть кода может быть помещена в общую утилиту.Например, предположим, что ваш шаблон T4 создает атрибуты для значений ключей ваших сущностей, вы можете автоматически определить, присутствуют ли значения ключей, и соответственно выполнить вставку / обновление.Кроме того, блок try SaveChanges catch retry
, который вы используете - хотя, возможно, и не нужен - может быть легко помещен в простой служебный метод, чтобы быть более СУХИМЫМ.