【问题标题】:Entity Framework foreign key that is not a primary key不是主键的实体框架外键
【发布时间】:2017-11-22 18:52:27
【问题描述】:

我的 MSSQL 数据库设计有问题。

我有 2 个如下所示的表:

CREATE TABLE tenants 
(
    tenantId INT PRIMARY KEY,
    tenantName VARCHAR
)

CREATE TABLE users 
(
    userId INT PRIMARY KEY,
    userName VARCHAR,
    tenantId INT,
    FOREIGN KEY (tenantId) REFERENCES tentants(tenantId)
)

为了唯一性,我想从仅 ID 切换到 GUID,并更改了表格。 我读过出于性能原因不建议将 GUID 作为主键。所以我保留了 ID:

CREATE TABLE tenants 
(
    tenantId INT PRIMARY KEY,
    tenantGuid UNIQUEIDENTIFIER,
    tenantName VARCHAR
)

CREATE TABLE users 
(
    userId INT PRIMARY KEY,
    userGuid UNIQUEIDENTIFIER,
    userName VARCHAR,
    tenantGuid UNIQUEIDENTIFIER,
    FOREIGN KEY (tenantGuid) REFERENCES tentants(tenantGuid)
)

现在 Entity Framework 正在疯狂地忽略所有关系,因为 guid 不是主键的一部分。

在旧帖子中,我读到这将不受支持。还是不支持吗?

我如何支持解决这个问题?

非常感谢!

也很抱歉格式不好,编辑器不尊重我的换行符:/

很快

【问题讨论】:

  • 最后你希望 GUID 成为主键吗?
  • 什么具体的 RDBMS 是干什么用的? SQL 只是查询语言 - 许多 RDBMS 使用,例如 oraclepostgresqlsybasedb2mysqlsql-server - 你应该真的告诉我们您正在使用什么具体的 RDBMS
  • 感谢 Andrew 的格式化!我正在使用 MSSQL 2016 Express

标签: c# sql entity-framework entity-framework-6 guid


【解决方案1】:

为了唯一性,我想从仅 ID 切换到 GUID,并更改了表格。

您实际上不需要切换到 GUID 来确保唯一性。只要将 ID 设置为主键,就可以保证您的 ID 是唯一的(无论它们是哪种类型,比如整数)。

我已阅读到出于性能原因,不建议将 GUID 作为主键。所以我保留了 ID

tenantGuid uniqueidentifier foreign key to tenants.tenantGuid

假设您在使用 GUID 作为键时谈论“连接”的性能,那么将 ID 作为主键不会有任何影响,因为无论如何都会在 GUID 上进行查询。

现在实体框架正在变得疯狂,只是取消所有关系,因为 guid 不是主键的一部分。

我如何支持解决这个问题?

我相信你最好不要解决这个问题,而是选择返回到以前使用整数 ID 的数据库设计。或者最终使用 GUID 作为主键(在此过程中删除整数 ID)。

【讨论】:

  • 我猜你是对的。这很可悲,但似乎是最好的选择
【解决方案2】:

如果你还想给我们唯一标识符,你需要注意以下两点

将 tenants.tenantGuid 设置为 UNIQUE KEY,并将 users.tenantGuid 设置为相同的数据类型

修改表格如下

CREATE TABLE tenants (
    tenantId INT PRIMARY KEY,
    tenantGuid UNIQUEIDENTIFIER UNIQUE,
    tenantName VARCHAR
)

CREATE TABLE users (
    userId INT PRIMARY KEY,
    userGuid UNIQUEIDENTIFIER,
    userName VARCHAR,
    tenantGuid UNIQUEIDENTIFIER,
    FOREIGN KEY (tenantGuid) REFERENCES tenants(tenantGuid)
)

希望这对你有用

【讨论】:

  • 设置“tenantGuid UNIQUEIDENTIFIER UNIQUE”不起作用,并将其设置为“tenantGuid UNIQUEIDENTIFIER UNIQUE KEY”会在 DB 项目中生成错误:“键附近的语法不正确”,需要 '(' 或 SELECT.. .
  • 我使用的是 MSSQL Server 2016,上面的查询运行没有任何错误。您可以尝试创建 UNIQUE KEY 约束,例如 > ALTER TABLE tenants ADD CONSTRAINT UQ_some_constraint_name UNIQUE(tenantGuid)
  • 是的,它在 MSSQL Server 上运行,但实体框架仍然不喜欢它,因为tenantGuid 不是表租户键的一部分。问题在于实体框架,而不是 MSSQL 服务器:/
猜你喜欢
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多