我正在使用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属性。
更新
以下是由O / R设计人员创建的LinqTSql审计类型的类定义的初始部分:
[Table(Name="dbo.tApplicationAudit")]
[InheritanceMapping(Code="1", Type=typeof(tOnHoldReasonAudit), IsDefault=true)]
public partial class tApplicationAudit : INotifyPropertyChanging,INotifyPropertyChanged
public partial class tOnHoldReasonAudit : tApplicationAudit
答案 0 :(得分:0)
我想出来了。这是因为派生类型的属性只是隐藏了基类型上的相应属性。当我将基类型的属性更改为虚拟和更改派生类型的覆盖时,它修复了它。我认为linq to sql必须将其强制转换为派生类型才能访问数据。