2014-10-09 2 views
0

Мое требование состоит в том, чтобы установить общий способ гарантировать, что в базе данных не хранятся ведущие/конечные пробелы. Наша архитектура WCF-> Бизнес логика Managers-> Generic Repository-> Entity Framework 5.0 -> DBОбрезные пространства при десериализации в WCF-сервисах

Теперь у меня есть 2 способа сделать это

  1. ли это на Generic Repository (но здесь я буду нужно искать весь граф объекта для свойств строки и изменять значение)
  2. Сделайте это во время десериализации в конвейере WCF (но здесь мне, возможно, придется поместить свой собственный сериализатор, который я не хочу делать так, как все Я хочу, это событие во время сериализации, где я могу запросить тип свойства и изменить его значение)

Я сторонник подхода 2, но ищущий самый простой способ сделать это, не меняя весь сериализатор. Есть ли способ его изменения без использования пользовательского сериализатора. В настоящее время мы используем XmlSerializer.

Ищете следующий вход (2)

  1. Какой подход лучше бы в исполнении
  2. Как я могу присоединить мой маленький метод в существующий процесс сериализации в трубопроводе WCF.

Спасибо, Avi

+0

«Мое требование поставить общий способ гарантировать, что никакие ведущие/ведомые пробелы не сохраняются в базе данных», на каком уровне находится ваше требование ? Является ли это транспортным требованием? – Aron

+0

Это требование постоянства, сообщение уже достигло последнего уровня, теперь его необходимо сохранить. Я хотел бы обратиться к этому в то время, когда XML десериализуется, поэтому мне не нужно снова использовать отражение типов запросов и их значений. – asolvent

+1

Это был риторический вопрос. Я знаю ответ на свой вопрос. Моя точка зрения - «Принцип наименьшего удивления». Что касается вашей заботы о размышлении. У вашего ORM уже есть метаданные по типам сущностей (он знает обо всех свойствах, а какие из них - строки). Чем дальше ваш код, реализующий это требование, это фактический уровень, из которого он исходит ... чем больше «сюрпризов» у вас есть, тем больше вероятность того, что какой-то промежуточный код подталкивает его к вам. – Aron

ответ

0

Ваш код должен работать на уровне данных, а не сериализации слоя, учитывая, что именно там требование возникло.

Что касается реализации, у вас есть два варианта.

Вы можете использовать DbChangeTracker или использовать IDbCommandInterceptor (новый в EF6), чтобы изменить поведение вашего контекста EF.

Ниже, как вы можете легко сделать это с изменением трекера

public class FooContext : DbContext 
{ 
    public override int SaveChanges() 
    { 
     var items = ChangeTracker.Entries().Where(e => e.State == EntityState.Added).ToList(); 
     foreach(var item in items) 
     foreach(var property in item.PropertyNames) 
     { 
      var propValue = item[property] as string; 
      if(propValue != null) 
      { 
       item[property] = propValue.Trim(); 
      } 
     } 
     return base.SaveChanges(); 
    } 
} 
Смежные вопросы