C# 不是主键的实体框架外键

C# 不是主键的实体框架外键,c#,sql,entity-framework,entity-framework-6,guid,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(tenan

我的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作为主键。所以我保留了身份证:

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不是主键的一部分,所以它忽略了所有关系

我在以前的帖子上读到,这是不受支持的。是否仍不受支持

我如何支持解决这个问题

非常感谢

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

苏蒙

为了唯一性,我想从只有ID切换到GUID,并更改了表

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

我已经读到,出于性能原因,不建议将guid作为主键。所以我保留了身份证

tenantGuid租户的唯一标识符外键。tenantGuid

假设在使用GUID作为键时谈论“连接”的性能,那么保持ID作为主键不会有什么区别,因为无论如何都会对GUID进行查询

现在,实体框架正在变得疯狂,因为guid不是主键的一部分,所以它忽略了所有关系

我如何支持解决这个问题


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

如果您仍想使用唯一标识符,您需要注意以下两件事

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

希望这对您有用

最后您希望GUID成为主键?供将来参考:这是什么具体的RDBMS
SQL
只是一种查询语言——许多RDBMS都使用这种语言,比如
oracle
postgresql
sybase
db2
mysql
,或者
SQL server
——你真的应该告诉我们你在使用什么具体的RDBMS进行格式化!我正在使用MSSQL 2016 ExpressSetting“tenantGuid UNIQUEIDENTIFIER UNIQUE”不起作用,将其设置为“tenantGuid UNIQUEIDENTIFIER UniqueKey”会在DB项目中生成错误:“KEY附近的语法不正确”,应为'('或选择…我正在使用MSSQL Server 2016,上面的查询运行时没有任何错误。您可以尝试创建唯一的键约束,如>更改表租户添加约束UQ\u一些约束\u名称唯一(租户GUID)是的,它在MSSQL服务器上运行,但实体框架仍然不喜欢它,因为tenantGuid不是表tenants上的键的一部分。问题在于实体框架,而不是MSSQL服务器:/I我想你是对的。这很遗憾,但似乎是最好的选择