实体框架外键不是主键

时间:2017-11-22 18:52:27

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

我的MSSQL数据库设计出现问题。

我有两张看起来像这样的表:

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)
)

现在实体框架正在疯狂地解除所有关系,因为guid不是主键的一部分。

在旧帖子上,我已经读过,这将不受支持。它仍然不受支持吗?

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

非常感谢!

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

soomon

2 个答案:

答案 0 :(得分:1)

  

我想从唯一ID切换到GUID并更改表格。

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

  

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

     

tenantGuid uniqueidentifier foreign key to tenants.tenantGuid

假设您在使用GUID作为密钥时谈论'联接'的性能,那么将ID作为主键保持不会有所不同,因为无论如何都将在GUID上进行查询。

  

现在实体框架正在疯狂地解除所有关系,因为guid不是主键的一部分。

     

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

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

答案 1 :(得分:0)

如果您仍然想要我们的唯一标识符,您需要注意以下两件事

  

将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)
)

希望这适合你