如何为实体框架数据库的varchar列创建唯一键?

Lai*_*290 5 sql sql-server entity-framework unique

我曾经看过youtube视频教程教学如何创建独特的密钥

http://www.youtube.com/watch?v=oqrsfatxTYE&list=PL08903FB7ACA1C2FB&index=9

在视频中,他创建了一个用于Email(nvarchar)列的唯一键,我可以在手动创建数据库时创建它,但是当我尝试为使用实体框架代码创建的数据库创建唯一键时,首先使用下一个查询

ALTER  TABLE Peoples
   ADD CONSTRAINT UQ_MyTable_Email UNIQUE (email)
Run Code Online (Sandbox Code Playgroud)

它会产生一个错误:

Msg 1919, Level 16, State 1, Line 2
Column 'email' in table 'Peoples' is of a type that is invalid for use as a key column in an index.
Run Code Online (Sandbox Code Playgroud)

有什么问题?我该怎么做才能为nvarchar(max)列创建唯一键?

M.A*_*Ali 8

说如果你创建这个表

CREATE TABLE ConstTable 
(ID INT, 
Email VARCHAR(1000)
CONSTRAINT uc_Email UNIQUE (Email)
)
GO
Run Code Online (Sandbox Code Playgroud)

你会得到一个警告:

警告!最大密钥长度为900字节.索引'uc_Email'的最大长度为1000个字节.对于某些大值组合,插入/更新操作将失败

你列上要定义一个唯一约束应小于或等于900个字节,所以你可以有一个VARCHAR(900)NVARCHAR(450)列,如果你希望能够在该列上创建一个唯一约束

与VARCHAR(450)相同的上表在没有任何警告的情况下创建

CREATE TABLE ConstTable 
(ID INT, 
Email VARCHAR(900)
CONSTRAINT uc_Email UNIQUE (Email)
)
GO
Run Code Online (Sandbox Code Playgroud)

结果

命令已成功完成.

测试你的表

说这是你的桌子

CREATE TABLE ConstTable 
(ID INT, 
Email VARCHAR(MAX)
)
GO
Run Code Online (Sandbox Code Playgroud)

现在尝试在VARCHAR(MAX)数据类型上创建任何索引,您将得到相同的错误.

CREATE INDEX ix_SomeIdex
ON ConstTable (Email)
Run Code Online (Sandbox Code Playgroud)

错误信息

消息1919,级别16,状态1,行1列'ConstTable'中的列'电子邮件'属于无法用作索引中的键列的类型.