Я использую LINQ to SQL с наследованием одной таблицы для журнала аудита.Существует поле / свойство с именем Type, которое я использую в качестве дикриминатора, и я создал базовый тип и один унаследованный тип (будет больше позже, если я действительно смогу заставить это работать).
Так что мне не нужно писать другой метод для вставки каждого другого производного типа аудита, метод принимает базовый тип, но он не работает, он выдает SQLTypeException
, говоря, что датавне диапазона, несмотря на то, что единственное поле даты было установлено с помощью DateTime.Now
.Я написал некоторый основной код отладки и обнаружил странный эффект.Приведенный ниже код работает нормально:
tOnHoldReasonAudit dbAudit = new tOnHoldReasonAudit();
dbAudit.ApplicationID = 1;
dbAudit.Date = DateTime.Now;
dbAudit.UserID = 9;
pi_DataContext.tApplicationAudits.InsertOnSubmit(dbAudit);
pi_DataContext.SubmitChanges();
Однако, если я изменю первую строку на
tApplicationAudit dbAudit = new tOnHoldReasonAudit();
, где tApplicationAudit
- базовый тип, он выдает исключение, а именно:
System.Data.SqlTypes.SqlTypeException: SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
Почему это не работает, что именно здесь происходит.В моем живом коде у меня есть метод AddAudit(tApplicationAudit Audit)
, который выполняет реальную работу, я не хочу писать метод add для каждого другого производного типа, так как это побеждает весь объект, если я должен сделать это, я мог бы какпокончите с производными типами аудита и просто установите свойство type для базового класса.
Обновление:
Ниже приведена начальная часть определений классов для созданных типов аудита LinqTSql, которые были созданы.O / R дизайнер:
[Table(Name="dbo.tApplicationAudit")]
[InheritanceMapping(Code="1", Type=typeof(tOnHoldReasonAudit), IsDefault=true)]
public partial class tApplicationAudit : INotifyPropertyChanging,INotifyPropertyChanged
public partial class tOnHoldReasonAudit : tApplicationAudit