Я просто хотел добавить свой сценарий для всех, у кого может быть эта проблема.
Мы используем пользовательский T4 для нашего dqml Linq to SQL. Мы просто изменили исходные свойства строки get / set для автоматической обрезки и установки нуля.
get { return _OfficiantNameMiddle.GetValueOrNull(); }
set
{
value = value.GetValueOrNull();
if (_OfficiantNameMiddle != value)
{
_IsDirty = true;
OnOfficiantNameMiddleChanging(value);
SendPropertyChanging("OfficiantNameMiddle");
_OfficiantNameMiddle = value;
SendPropertyChanged("OfficiantNameMiddle");
OnOfficiantNameMiddleChanged();
}
}
У устаревших данных в нашей базе данных было несколько начальных / конечных пробелов, поэтому любая проверка параллельности для этих столбцов не привела к совпадению (сравнивалось усеченное значение со значением необрезанного значения базы данных). Было очень легко профилировать SQL, захватить SQL и начать комментировать элементы в предложении WHERE, пока он не начнет возвращать строку во время проверки параллелизма.
К счастью, в наших таблицах есть поле LastUpdatedOn, которое автоматически устанавливается с помощью OnValidate (System.Data.Linq.ChangeAction).
partial void OnValidate(System.Data.Linq.ChangeAction action)
{
if (action == System.Data.Linq.ChangeAction.Insert)
{
CreatedBy = CurrentUserID;
CreatedOn = DateTime.Now;
LastUpdatedBy = CreatedBy;
LastUpdatedOn = CreatedOn;
}
else if (action == System.Data.Linq.ChangeAction.Update)
{
LastUpdatedBy = CurrentUserID;
LastUpdatedOn = DateTime.Now;
}
}
Чтобы обойти проблему, мы просто устанавливаем проверку параллелизма Никогда во всех столбцах, кроме столбцов первичного ключа и столбца LastUpdatedOn. Это сработало для нас.