LINQ to SQL单表继承

时间:2010-06-16 13:56:42

标签: c# .net linq linq-to-sql

我正在使用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

1 个答案:

答案 0 :(得分:0)

我想出来了。这是因为派生类型的属性只是隐藏了基类型上的相应属性。当我将基类型的属性更改为虚拟和更改派生类型的覆盖时,它修复了它。我认为linq to sql必须将其强制转换为派生类型才能访问数据。