我见过很多关于如何将字段标记为标识列的帖子和答案。其中许多已过时,并且目标是旧版本的Entity Framework。
有些资源告诉我在字段上使用属性:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
其他资源告诉我将此代码添加到OnModelCreating
方法:
modelBuilder.Entity<User>().Property(u => u.ID).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity);
我应该使用哪一个?第一,第二,两者都没关系,还是其他什么?
答案 0 :(得分:5)
这是针对那些在这个问题上失去两个多小时的人。
我通过将列标记为KEY而犯了一个错误,后来我意识到它不是关键,而只是一个列。
我的模型有依赖关系,所以我不能只删除KEY属性并让它成为。在生成相应的迁移和设置后,默认的Id列永远不会作为SQL Server的标识列:identity as true。
相反,我不得不从上下文中删除Dbset,删除对它的所有引用以及其他实体中的引用。并生成一个删除表的迁移,然后修复模型..确保它没问题。然后生成完善的模型,重新插入所有依赖项。
这是我第一手的错误。所以除了我自己,我没有责备。
希望没有人再次遇到这种情况,但如果真的发生了,我就这样做了。
答案 1 :(得分:4)
只要主键属性的类型是数字或GUID,按照惯例,Code First将自动将键配置为标识列。
这意味着您不需要在代码中添加任何配置以明确将属性设置为标识列,因为Code First已经使用了代码。您设置的数据注释属性或流畅的API配置是无用的。
仅当您要禁用标识时,才在数字或GUID类型主键上使用这些配置。
答案 2 :(得分:0)
要么,你的选择。我使用两者的混合:属性用于这样的简单事物,modelBuilder
用于属性未涵盖的更复杂场景。它们都是同等有效的,你会看到它(在EF'惯例'下),这些属性用来告诉modelBuilder
该怎么做。