C# 不是主键的实体框架外键
我的MSSQL数据库设计有问题 我有两张像这样的桌子: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
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我想你是对的。这很遗憾,但似乎是最好的选择