2010-06-16 54 views
0

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

你可以發佈tApplicationAudit和tOnHoldReasonAudit類的代碼嗎?如果沒有看到代碼,很難弄清楚什麼是錯的。 – 2010-06-16 14:04:16

+0

該代碼由O/R設計人員生成,完整的類定義相當大。我已經更新了這個帖子,只是提供了類的定義和屬性。 – 2010-06-16 14:10:07

+0

發佈導致錯誤的日期屬性定義 – 2010-06-16 14:27:24

回答

0

我想通了這一點。這是因爲派生類型的屬性只是隱藏了基類型的相應屬性。當我將基類型的屬性更改爲虛擬類型和派生類型的重寫時,它修復了它。我認爲linq to sql必須將其轉換回派生類型才能訪問數據。