2012-10-28 78 views
0

我在我的項目中有一個審計追蹤系統,從http://doddleaudit.codeplex.com/。 正如你可以在這個圖像上看到它記錄了EntityTable - 這是表名和EntityTableKey - 這是主鍵enter image description here表名作爲主鍵的一部分

我想審計記錄與它有表關聯記錄器,然後在linq中查詢結果到sql。但問題是如果審計表有記錄訂單和記錄產品它永遠不會知道主鍵,記錄屬於哪裏,因此我需要使用表名作爲鍵的一部分。

所以問題是:是否有可能創建一個關係,將有一個組合主鍵,其中包含表名稱?

AuditRecord to Orders 
AuditRecord to Products 
+0

最好將auditrecords分成兩個單獨的表。 1訂單和其他產品 – Sami

+0

@Sami - 這不是這種系統通常應該如何工作。審計跟蹤顯示數據庫表中的記錄後記錄更改。爲你的數據庫中的每個表創建一個「metatable」並不方便。 – OzrenTkalcecKrznaric

+0

如果操作是「刪除」,該行將不再存在於非審計表中... –

回答

0

你可以這樣做,但我會推薦一些不同的方法。

不要在你的PK/FK中使用char/varchars/nvarchar,它會擴大索引。我寧願創建另一個表,它將保存所有表的TableId/TableName對(如果您願意,可以使用sys.tables.object_id作爲您的ID),並在AuditRecords中包含FK。然後在AuditRecords和AuditRecordFields(Id,TableId)之間建立組合鍵。

另一件事:

  • EntityTable和AssociationTable應該是數據類型爲sysname類型
  • AuditDate的類型可以是日期(可從SQL Server 2008)

編輯的:

如果你喜歡從每個對象訪問審計記錄,你可以爲你的審計對象創建一個基類並實現以下方法(注意,它沒有經過測試):

public IQueryable<AuditRecord> AuditRecords 
{ 
    get 
    { 
     MyContext ctx = new MyContext(); 

     var ars = from ar in ctx.AuditRecords 
        where ar.EntityTable.Equals(this.GetType().Name) 
        select ar; 

     return ars; 
    } 
} 
+0

索引鍵是個好主意,但恐怕這不是我需要實現的目標。我想在最後得到的是這樣的例子:product.AuditRecord.Where(a => a.AuditDate jekcom

+0

爲了發生這種情況(並避免黑客攻擊你的Linq2Sql),你可以在每個實體表和審計記錄之間添加FK(Order.AuditRecordId,Product.AuditRecordId ...),但這隻會讓您獲得最後一條審計記錄。但是,如果我記得正確,則可以使用partial擴展每個數據類,然後向其中添加AuditRecord屬性(方法?),在該位置查詢AuditRecord表並返回按表過濾的IQueriable集合,以便您可以執行過濾之後的過濾... – OzrenTkalcecKrznaric

相關問題