Изменение дозвуковой даты после вызова .Save () - PullRequest
2 голосов
/ 09 октября 2011

Я начал использовать Subsonic для разработки небольшого веб-приложения CMS. Я заметил, что когда бы я ни вызывал метод .Save () объекта Subsonic-Table-Object, мое поле даты с именем «CreatedOn» перезаписывалось сегодняшней датой.

Дозвуковая информация: версия 3.0.0.4 с использованием ActiveRecord

    // add article from dataset
    Article a = new Article(); 
    a.Title = article["title"].ToString();
    a.Synopsis = article["teaser"].ToString();
    a.Body = article["body"].ToString();
    a.Keywords = string.Empty;
    a.Photo = string.Empty;
    ///articles/2010/04/14/deregistration-of-trade-unions
    a.CreatedOn = DateTime.Parse(sDestin.Substring(9, 10)); 
    a.UpdatedOn = DateTime.Parse(sDestin.Substring(9, 10));
    a.Save();

Перед сохранением в поле CreatedOn устанавливается правильная дата (такая же, как и для Updated). Как только метод .Save () запущен, поле CreatedOn меняется на сегодняшнюю дату. Поле «Дата обновления» сохраняет ту же дату, которая была ему назначена.

Что я пробовал: Я дважды проверил таблицу Article, там нет значений по умолчанию, таких как (GetDate ()), для любых полей даты. Я перестраивал свои шаблоны несколько раз. Я также попытался сбросить и сохранить поле даты CreatedOn во второй раз.

Любая помощь будет оценена.


Ответ

После дальнейшего расследования я обнаружил проблему. Subsonic, похоже, генерирует строку кода, которая манипулирует датой. Я не знаю, почему он делает это только для даты CreatedOn, а не для даты Updated. Оба поля идентичны по структуре (MSSQL 2005).

Извлечено из метода Save () объекта моей статьи.

        public void Add(IDataProvider provider){

        //this.CreatedOn=CMSDB.DateTimeNowTruncatedDownToSecond(); // commenting this out works, CreatedOn is no longer overwritten

        var key=KeyValue();
        if(key==null){
            var newKey=_repo.Add(this,provider);
            this.SetKeyValue(newKey);
        }else{
            _repo.Add(this,provider);
        }
        SetIsNew(false);
        OnSaved();
    }

Вот метод аномального контекста, созданный Subsonic:

        internal static DateTime DateTimeNowTruncatedDownToSecond() {
        var now = DateTime.Now;
        return now.AddTicks(-now.Ticks % TimeSpan.TicksPerSecond);
    }

Примечание: Stackoverflow потребовал, чтобы я подождал 6 часов, чтобы опубликовать ответ, поэтому я разместил его здесь.

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Если принятый ответ для вас неприменим, как в моем случае, вы можете сделать

new InlineQuery().Execute(string query)

для обновления указанных полей.

0 голосов
/ 12 октября 2011

«CreatedOn» - это соглашение в SS ActiveRecord - когда поле называется «CreatedOn», код, который вы видите для установки даты, добавляется шаблонами T4. Это явно не полезно в вашем случае.

Два варианта:

  • отредактируйте шаблон T4, чтобы удалить ошибочную строку (чтобы вы не смогли воспользоваться автоматической отметкой времени ни в одном из объектов вашей модели)

  • изменить имя поля на другое

...