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

Linq to sql Linq2SQL数据库设计:映射复合/代理键,linq-to-sql,database-design,composite-key,surrogate-key,Linq To Sql,Database Design,Composite Key,Surrogate Key,想象一下,我有一个巨大的数据库,其中存储了来自不同数据源(如两个不同论坛)的线程和帖子。对于每个数据源,实体的Id(例如ThreadId、PostId…)是唯一的,但它可能与另一个数据源获得的实体Id冲突。例如,forum1和forum2都可以具有Threadid=1的线程: 我正在使用Linq2Sql和存储库模式将我的应用程序连接到数据库。我了解到在使用Linq2Sql时应该避免使用复合键(ThreadId和DatasourceId之间)。因此,我想代理主键是我唯一的选择(是吗?): 表线程:

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

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

表线程:

  • UniqueId-int,PK
  • 数据源ID-int
  • ThreadId-int
表员额:

  • UniqueId-int,PK
  • 数据源ID-int
  • PostId-int
  • ThreadId-int,FK到Threads.ThreadId
现在,我的问题是:Linq2Sql能否在其生成的类中映射POST和线程之间的1:1关系?
如果一篇文章有一个Thread.ThreadId的外键,并且有两个实体具有相同的ThreadId(当然是不同的数据源ID),会发生什么情况?我猜这将返回帖子上分配的线程的集合-我不想要!我是否仍然可以为共享相同数据源ID的每篇文章返回一个线程?

您是对的,LinqToSql不知道某个线程ID是唯一的。可以通过在每个查询的where子句中包含Datasourceid来实现这一点

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

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

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

然后我应该忽略Linq自动生成的属性吗?有没有更好的解决办法?数据库模式只是初稿……您指的是哪些属性?您考虑过实体框架而不是L2S吗?我的Linq2Sql体系结构已经在使用,因此无法交换。Linq为每个实体生成一个类,例如Post。此类有一个属性Post.Thread,它是对指定线程对象的引用。顺便说一句,如果我接受你的建议,我不确定Linq是否能够检测到线程的外键不再是1:1关系。啊,我现在明白你的意思了。你的外键应该是唯一的。这样,引用将是唯一的。我写了一个类似这样的讨论论坛,线程表上只有datasourceid。UniqueId的FK的问题是,我以随机的实体顺序进行大量导入(线程并不总是在帖子之前添加)。因此,在导入帖子时,我无法获取DB生成的线程的唯一ID。但是我有ThreadId。我应该忽略Linq自动生成的属性吗?有没有更好的解决办法?数据库模式只是初稿……您指的是哪些属性?您考虑过实体框架而不是L2S吗?我的Linq2Sql体系结构已经在使用,因此无法交换。Linq为每个实体生成一个类,例如Post。此类有一个属性Post.Thread,它是对指定线程对象的引用。顺便说一句,如果我接受你的建议,我不确定Linq是否能够检测到线程的外键不再是1:1关系。啊,我现在明白你的意思了。你的外键应该是唯一的。这样,引用将是唯一的。我写了一个类似这样的讨论论坛,线程表上只有datasourceid。UniqueId的FK的问题是,我以随机的实体顺序进行大量导入(线程并不总是在帖子之前添加)。因此,在导入帖子时,我无法获取DB生成的线程的唯一ID。不过我确实有ThreadId。我越是考虑它,就越喜欢使用ThreadId和DatasourceId组合键的解决方案。这(不是)对Linq有什么作用?我可以在代码中设置这两个字段并将它们保存到DB中吗?或者我需要线程和POST之间的共享DataContext吗?我越想它,我就越喜欢使用结合了ThreadId和DatasourceId的复合键的解决方案。这(不是)对Linq有什么作用?我可以在代码中设置这两个字段并将它们保存到DB中吗?或者我需要在线程和帖子之间共享DataContext吗?