Технически вы можете добавить реализацию в одном классе с контрактом данных. Только те свойства, которые приписаны будут сериализованы.
В вашем примере у вас есть объект, транспорт и способ записи в базу данных в одном классе:
[DataContract]
public class LogEntry
{
...
public void WriteToDatabase()
Я бы порекомендовал, чтобы ваш интерфейсный код и сериализуемые объекты были отделены от вашего сопротивления. Я бы даже порекомендовал отдельный уровень доступа к базе данных, который не знает уровней и ответственности над уровнями над ним, которые владеют транспортной и бизнес-логикой.
Если постоянство базы данных находится в вашем контракте данных и на транспортном уровне, со временем будет невозможно разделить и заменить слои, если вам нужно - это будет один кусочек кода.
Разделение слоев также помогает при тестировании. Возможность протестировать блок кода без всех зависимостей полной системы является ценным. Например, если вы разделяете персистентность вашей базы данных и даже отделяете ее с помощью интерфейса, для модульного тестирования вашей бизнес-логики вы можете заменить персистентность реализацией с подмножеством в памяти.
Одной из проблем становится то, как вы передаете эти объекты в DAL, если он не знает об объектах, которые переносятся. Чтобы обеспечить разделение, я видел типы dll, которые просто содержат эти структуры с декорациями контракта данных, сервисный уровень, которому принадлежит транспорт, и BLL / DAL, которые оба ссылаются на типы dll.
Надеюсь, это поможет.