Linq2SQL数据库设计:映射复合/代理键

时间:2011-04-08 12:08:15

标签: linq-to-sql database-design composite-key surrogate-key

我有一个巨大的数据库,存储来自不同数据源的线程和帖子,如两个不同的论坛。对于每个数据源,实体的Id(例如,ThreadId,PostId ......)是唯一的,但是它可能与由另一个数据源获得的实体的Id冲突。例如,forum1和forum2都可以有一个Threadid = 1的线程:

我使用Linq2Sql和存储库模式将我的应用程序连接到数据库。我读到使用Linq2Sql时应该避免使用复合键(在ThreadId和DatasourceId之间)。因此我猜一个代理主键是我唯一的选择(是吗?):

表格主题:

  • UniqueId - int,PK
  • DatasourceId - int
  • ThreadId - int
  • ...

表格帖子:

  • UniqueId - int,PK
  • DatasourceId - int
  • PostId - int
  • ThreadId - int,FK to Threads.ThreadId

现在,我的问题是:Linq2Sql能否在其生成的类中映射帖子和线程之间的1:1关系? 如果帖子有Thread.ThreadId的外键并且有两个实体具有相同的ThreadId(当然是不同的DatasourceIds)会发生什么?我想这将返回帖子上分配的线程的集合 - 我不想要!我可以以某种方式为每个帖子返回一个单独的线程,这个帖子是共享相同DatasourceId的帖子吗?

1 个答案:

答案 0 :(得分:0)

你是对的,Linq To Sql不会知道某个Thread Id是唯一的。您可以通过在每个查询的where子句中包含Datasourceid来实现此目的

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