2011-04-08 75 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