2014-02-21 24 views
1

我在我的項目中使用EntityFramework 6,該項目使用AuditLog表跟蹤多個其他表中的更改(簡單地說,我將它們命名爲T1,T2 ,. T5沒有這個細節)。 AuditLog表中的每個記錄都用於其他表(T1,... T5)中的一個。所以這對於很多關係來說是[0..1]。在EntityFramework中使用獨立協會實現「通用」外鍵

我不想使用基於標準FK約束的關聯,因爲它會在AuditLog表中引入5個FK,並且每個記錄的5個FK列中有4個爲空。我想使用AuditLog表中的「公共」列作爲其他表的「公共」FK,此FK列中的值可以是5個表中的一個的主鍵。其結果是,對於審計日誌表生成以下SQL:

CONSTRAINT [FK_AuditLogT1] FOREIGN KEY ([EntityId]) REFERENCES [dbo].[T1] ([Id]), 
CONSTRAINT [FK_AuditLogT2] FOREIGN KEY ([EntityId]) REFERENCES [dbo].[T2] ([Id]), 
CONSTRAINT [FK_AuditLogT3] FOREIGN KEY ([EntityId]) REFERENCES [dbo].[T3] ([Id]), 
CONSTRAINT [FK_AuditLogT4] FOREIGN KEY ([EntityId]) REFERENCES [dbo].[T4] ([Id]), 
CONSTRAINT [FK_AuditLogT5] FOREIGN KEY ([EntityId]) REFERENCES [dbo].[T5] ([Id]) 

在運行時,當應用程序被添加類型T1(或T2 ... T5)的新對象,將EF將拋出由於以下異常到FK約束:

異常:INSERT語句與FOREIGN KEY約束「FK_AuditT2」衝突。衝突發生在數據庫「xxxx」, 表「dbo.T2」,列'Id'。

我試圖使用獨立關聯來映射AuditLog和其他表之間的關係,但沒有例外,但EF不會自動填充AuditLog表中的entityId列與其他表的主鍵。

有沒有辦法我可以使用獨立的關聯,但也維護審覈日誌entityId中的其他表的主鍵?

回答

1

你不能在Entity Framework關聯中這樣做 - 這是一個數據庫限制 - 一個字段不能處於多個關係中,因爲約束會衝突(例如,T1具有關鍵字10,但這不在T2中,因此約束你的「Key」字段將被打破

你沒有說你想在你的審計日誌中實現什麼,但是有很多努力爲Entity Framework實體添加自動審計日誌 - 這些將會更簡單一些,因爲你不需要明確地添加它們,但可能並不能滿足你所​​有的要求,其中包括:

加上通過搜索實體框架審覈日誌

+0

你是對發現的一些博客文章。我原來的想法是行不通的。在閱讀您在EF Audit上建議的帖子後,我放棄了FK關聯,並覆蓋SaveChanges()以管理「EntityId」的值。感謝您的建議。 – user3333649