如何在entity framework中使用String属性作为主键

我是EF的新手,尝试通过ETF6.0中的代码优先方法完成我的第一步,现在我遇到了问题。

我有一个房产

[Key] public string FooId { get; set; } 

这是我的模型的主要关键。

但如果我跑了

PM>更新 – 数据库

包管理器控制台中的命令更新到数据库的挂起迁移我收到以下错误:

标识列’FooId’必须是数据类型int,bigint,smallint,tinyint或十进制或数字,标度为0,并且约束为不可空。

如果我将模型中的PK更改为

 [Key] public int FooId { get; set; } 

一切正常。

但我需要PK为类型字符串,因为它在我的情况下绝对敏感。 我知道有缺点,但对我来说这是必要的。

我在这里看到一篇较旧的post如何将字符串作为entity framework中的主键! 。

但似乎没有解决我的问题,或者我只是不理解它。

我真的不能在SQL数据库中使用字符串作为PK吗?

或者有办法做到这一点?

这是在没有启用Identity Autoincrement的情况下创建PK的正确方法:

 [Key] [DatabaseGenerated(DatabaseGeneratedOption.None)] public string FooId { get; set; } 

如果您需要将主键设置为字符串,请不要将其设置为标识列。 标识列将为您生成主键值,如果您打算自己生成值,则应该关闭它们。

将字符串作为主键的原因是什么?

我只是将主键设置为自动递增整数字段,并在字符串字段上放置一个索引。

这样,如果您在桌面上进行搜索,它们应该相对较快,并且所有连接和正常查找都不会受到速度的影响。

您还可以控制索引的字符串字段的数量。 换句话说,如果您认为足够,您可以说“仅索引前5个字符”。 或者,如果您的数据可能相对类似,则可以索引整个字段。