2011-04-08 80 views
2

圖像,我有一個巨大的數據庫,存儲來自不同的數據源,如兩個不同的論壇的線程和帖子。對於每個數據源,實體的Id(例如ThreadId,PostId ...)都是唯一的,但它可能會與其他數據源獲得的實體的Id相沖突。例如,forum1和forum2都可以有Threadid = 1的線程:Linq2SQL數據庫設計:映射覆合/代理鍵

我正在使用Linq2Sql和存儲庫模式將我的應用程序連接到數據庫。我使用Linq2Sql時應該避免使用組合鍵(在ThreadId和DatasourceId之間)。所以我想,代理主鍵是我唯一的選擇(是嗎?):

表主題:

  • 唯一ID - INT,PK
  • 的DataSourceID - 詮釋
  • 的ThreadId - INT
  • ...

表帖子:

  • 唯一ID - INT,PK
  • 的DataSourceID - 詮釋
  • 帖子ID - 詮釋
  • 線程ID - INT,FK到Threads.ThreadId

現在,我的問題是:LINQ2SQL能夠映射生成的類中的帖子和線程之間的1:1關係? 如果一個帖子有一個外鍵給Thread.ThreadId,並且如果有兩個實體具有相同的ThreadId(但是不同的DatasourceIds,當然)會發生什麼?我想這將返回一個分配的線程集合 - 這是我不想要的!我可以以某種方式爲每個帖子返回一個單獨的線程,它是共享相同的DatasourceId的嗎?

+0

做到這一點,我越去想它,我就越想使用組合鍵結合的ThreadId和DataSourceID的希望的解決方案。那(不)與Linq一起工作?我可以在代碼中設置這兩個字段並將它們保存到數據庫中,還是需要在線程和帖子之間共享DataContext? – Shackles 2011-04-08 13:29:59

回答

0

你說得對,LinqToSql不會知道某個Threadid是唯一的。您可以通過在的DataSourceID您的where子句中的每個查詢

var myThreads = DataContext.Threads.Where(t => t.Datasourceid == 1); 
+0

我應該忽略Linq自動生成的屬性嗎?有沒有更好的解決方案?數據庫模式只是第一稿... – Shackles 2011-04-08 12:31:45

+0

你的意思是哪個屬性?你是否考慮過實體框架而不是L2S? – Geoff 2011-04-08 12:59:08

+0

我的Linq2Sql體系結構已經在使用中,因此無法交換。 Linq爲每個實體生成一個類,例如帖子。這個類有一個屬性Post.Thread,它是對分配的Thread對象的引用。我btw不確定Linq甚至可以檢測到,如果我接受你的建議,線程的外鍵不再是1:1的關係。 – Shackles 2011-04-08 13:11:18