SQL Server中主键和唯一索引的区别

cli*_*uke 5 c# sql sql-server asp.net-mvc entity-framework

我公司目前正在重写我们最近收购的应用程序.我们选择使用ASP.net mvc4来构建这个系统,并使用Entity Framework作为我们的ORM.我们收购的公司的前任所有者非常坚定地认为我们使用他们的旧数据库并且不改变它的任何内容,以便客户可以在我们开发不同模块的同时使用我们的产品与旧系统同时使用.

我发现旧的表结构没有主键,而是使用唯一索引作为主键.现在,当使用Entity框架时,我尝试在结构中匹配它们的表但由于EF生成主键而不是唯一索引而无法这样做.

当我联系前一位所有者并解释时,他告诉我"每张桌子中的唯一键是主键.它们是彼此的同义词."

我对数据库系统还是比较新的,所以我不确定这是否正确.任何人都可以澄清这个吗?

转储到SQL时,他的表生成:

-- ----------------------------
-- Indexes structure for table AT_APSRANCD
-- ----------------------------
CREATE UNIQUE INDEX [ac_key] ON [dbo].[AT_APSRANCD]
([AC_Analysis_category] ASC, [AC_ANALYSI_CODE] ASC) 
WITH (IGNORE_DUP_KEY = ON)
GO
Run Code Online (Sandbox Code Playgroud)

但我的系统生成:

-- ----------------------------
-- Primary Key structure for table AT_APSRANCD
-- ----------------------------
ALTER TABLE [dbo].[AT_APSRANCD] ADD PRIMARY KEY ([AC_Analysis_category])
GO
Run Code Online (Sandbox Code Playgroud)

编辑: 跟进问题这是我如何为此设计模型?我只习惯使用[Key]注释将其定义为主键,如果没有它,EF将不会生成该表.所以这样的事情:

[Table("AT_APSRANCD")]
public class Analysis
{
    [Key]
    public string AnalysisCode { get; set; }
    public string AnalysisCategory { get; set; }
    public string ShortName { get; set; }
    public string LongName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Adr*_*der 5

来自SQL UNIQUE Con​​straint

UNIQUE约束唯一标识数据库表中的每条记录.

UNIQUE和PRIMARY KEY约束都为一列或一组列的唯一性提供了保证.

PRIMARY KEY约束自动在其上定义UNIQUE约束.

请注意,每个表可以有许多UNIQUE约束,但每个表只有一个PRIMARY KEY约束.

此外,从创建唯一索引

如果该列在多行中包含NULL,则无法在单个列上创建唯一索引.同样,如果列组合在多行中包含NULL,则无法在多列上创建唯一索引.这些被视为重复值以用于索引目的.

而从创建主键

必须将PRIMARY KEY约束中定义的所有列定义为NOT NULL.如果未指定可为空性,则参与PRIMARY KEY约束的所有列的可为空性都设置为NOT NULL.