【问题标题】:Linq2SQL database design: mapping composite/surrogate keysLinq2SQL 数据库设计:映射复合/代理键
【发布时间】:2011-08-01 11:26:40
【问题描述】:

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

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

表线程:

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

表帖:

  • UniqueId - int, PK
  • DatasourceId - 整数
  • PostId - 整数
  • ThreadId - int,FK 到 Threads.ThreadId

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

【问题讨论】:

  • 我越想越喜欢使用组合键组合 ThreadId 和 DatasourceId 的解决方案。这(不)如何与 Linq 一起工作?我可以在代码中设置这两个字段并将它们保存到数据库中,还是我需要在线程和帖子之间共享 DataContext?

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


【解决方案1】:

你是对的,LinqToSql 不会知道某个 Threadid 是唯一的。您可以通过在每个查询的 where 子句中包含 Datasourceid 来做到这一点

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

【讨论】:

  • 我应该忽略 Linq 自动生成的属性吗?有没有更好的解决方案?数据库架构只是初稿......
  • 您指的是哪些属性?您是否考虑过实体框架而不是 L2S?
  • 我的 Linq2Sql 架构已经在使用中,因此无法交换。 Linq 为每个实体生成一个类,例如邮政。这个类有一个属性 Post.Thread,它是对分配的 Thread 对象的引用。顺便说一句,如果我接受您的建议,我不确定 Linq 甚至可以检测到线程的外键不再是 1:1 关系。
  • 啊,我明白你的意思了。您的外键应该是唯一标识。这样引用将是唯一的。我就这样写了一个论坛,Thread表上只有datasourceid。
  • 对 UniqueId 的 FK 的问题是我正在以随机的实体顺序进行大量批量导入(线程并不总是在帖子之前添加)。因此,当我导入帖子时,我无法获得数据库生成的线程的 UniqueId。我确实有 ThreadId。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多