我正在使用LINQ to SQL和單表繼承作爲審計日誌。有一個名爲Type的字段/屬性,我用它作爲dicriminator,我創建了一個基類型和一個單一的繼承類型(如果我真的能夠實現這個功能,將會有更多的類型)。LINQ to SQL單表Inhertiance
因此,我不必編寫不同的方法來插入每個不同派生的審計類型,該方法採用基類型,但它不起作用,它會拋出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
你可以發佈tApplicationAudit和tOnHoldReasonAudit類的代碼嗎?如果沒有看到代碼,很難弄清楚什麼是錯的。 – 2010-06-16 14:04:16
該代碼由O/R設計人員生成,完整的類定義相當大。我已經更新了這個帖子,只是提供了類的定義和屬性。 – 2010-06-16 14:10:07
發佈導致錯誤的日期屬性定義 – 2010-06-16 14:27:24