Я начал использовать 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 часов, чтобы опубликовать ответ, поэтому я разместил его здесь.