如何在 SQL Server 或实体框架中创建没有主键的一对多关系?

Posted

技术标签:

【中文标题】如何在 SQL Server 或实体框架中创建没有主键的一对多关系?【英文标题】:How to create a one to many relationship without primary key in SQL Server or Entity Framework? 【发布时间】:2022-01-09 21:15:12 【问题描述】:

我有 2 个表,如下所示:

A:

 [ID] [bigint] IDENTITY(1,1) NOT NULL,
 [AName] [uniqueidentifier] NOT NULL

B:

 [ID] [bigint] IDENTITY(1,1) NOT NULL,
 [ANameID] [uniqueidentifier] UNIQUE NOT NULL

我想在BA 之间创建一对多关系,其中B 表中的ANameID 可以使用AName 引用A 表中的一个或多个行A 表中的列。 A.AName 列不是主键。

表 A 中可以有多行具有相同的 AName 值,但表 B 中只有一行具有 ANameID 值。

如何在 SQL 或 EF 中实现这一点?

【问题讨论】:

你只需要在INTERSECTION中添加一个外键到ROADS即可。 我想你可能需要一个多对多的关系。如果您实际上是在为道路和交叉路口设计数据库,那么一条道路可以有很多交叉路口,而一个交叉路口也可以有很多道路。 请忽略表名。道路和十字路口的名称可能不是很好的选择。 TABLE A 中可以有许多行具有相同的 AName 值这使得你的目标就“关系”而言完全是无稽之谈。给定 name 的特定值,表 B 中的给定行将连接(或引用或任何合适的术语)表 A 中的多行。将表 A 中的列 AName 与表 A 中的列 ANameID 关联无济于事。表 B。我认为您可能会因为一个不明确的目标而让自己和您的读者感到困惑。 这叫做“一对多” 【参考方案1】:

如果您在 Roads 表中的 RoadId 上放置唯一索引,则可以创建外键。

但是,有两个想法:

    为什么不在道路上进行 PK?可能是 RoadId... 鉴于交叉点至少应包含两件事,您的 设计不完整。我假设这是开启的 目的,但只是想我会提到它...

【讨论】:

是的,我省略了两个表中所有不必要的列。 重点是表A中可以有多行在AName列中具有相同的值,因此声明该列UNIQUE是行不通的。

以上是关于如何在 SQL Server 或实体框架中创建没有主键的一对多关系?的主要内容,如果未能解决你的问题,请参考以下文章

如何在实体框架中创建只读实体?

如何在 vs2010 中创建/添加 sql server 精简版数据库?

我应该如何在实体框架中创建这种关系?

如何在实体框架中创建多对多映射?

如何使用 SSIS 在 SQL Server 中创建分隔符

如何在 SQL Server CE 中创建 AspNet Membership 数据库