我使用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方法,因为这会破坏整个对象,如果我必须这样做,我还不如去掉派生的审计类型,只在基类上设置类型属性。
更新:
下面是由O/R designer创建的LinqTSql审计类型类定义的初始部分:
[Table(Name="dbo.tApplicationAudit")]
[InheritanceMapping(Code="1", Type=typeof(tOnHoldReasonAudit), IsDefault=true)]
public partial class tApplicationAudit : INotifyPropertyChanging,INotifyPropertyChanged
public partial class tOnHoldReasonAudit : tApplicationAudit发布于 2010-06-16 22:34:15
我想通了。这是因为派生类型上的属性只是隐藏了基类型上的对应属性。当我将基类型上的属性更改为virtual,并将派生类型上的重写更改为virtual时,它修复了它。我认为linq to sql一定是将其转换回派生类型以访问数据。
https://stackoverflow.com/questions/3053878
复制相似问题