0

我在数据库中有两列设置为主键,比如说Code1Code2。我使用实体框架流利的 api 来创建这样的密钥:

entity.HasKey(p => new { p.Code1, p.Code2 }).HasName("table_pkey");

我需要的是 key 按字典顺序排列。例如,当我在数据库中有记录时。

var code1 = "AA01";
var code2 = "AB01";
var pkey = "AA01AB01";

我尝试添加

var code1 = "AB01";
var code2 = "AA01";
var pkey = "AB01AA01";

我希望这被视为数据库的重复键,因此不允许添加它们。

谢谢您的帮助

4

1 回答 1

1

'AA01AB01'并且'AB01AA01'彼此相等,因此您不能在此处强制违反主键。看来您在这里实际需要的是 2 个约束;第一个保证值Code1小于Code2然后主键约束。在 T-SQl 中,这将被定义如下:

CREATE TABLE dbo.YourTable (Code1 char(4) NOT NULL,
                            Code2 char(4) NOT NULL,
                            pkey AS Code1 + Code2 PERSISTED);
GO
ALTER TABLE dbo.YourTable ADD CONSTRAINT CK_CodeOrder CHECK (Code1 < Code2);
GO
ALTER TABLE dbo.YourTable ADD CONSTRAINT PK_YourTable PRIMARY KEY NONCLUSTERED (Pkey); --As this doesn't doesn't appear to be always ascending
GO

INSERT INTO dbo.YourTable (Code1,Code2)
VALUES('AA01','AB01');
GO
INSERT INTO dbo.YourTable (Code1,Code2)
VALUES('AB01','AA01'); --Fails as Code1 is greater than Code2
GO

在您的应用程序中,您可能希望检查它Code1是否也小于Code2并“交换”这些值(如果不是)。

于 2021-03-14T11:26:48.880 回答