使用Code-First和Entity Framework时如何实现非自动增量的主键?

6
public class Movie
{
    public int Id { get; set; }

    [Required]
    [StringLength(255)]
    public string Name { get; set; }

    public virtual IList<Genre> Genre { get; set; }
    public virtual IList<Cast> cast { get; set; }

    [Display(Name = "Release Date")]
    public DateTime ReleaseDate { get; set; }
}

public class Genre
{
    public int Id { get; set; }

    [Required]
    [StringLength(255)]
    public String Name { get; set; }
}

这是我的两个模型。它们运行得非常好,但是主键上没有实现自动增量。

我遇到了id为空的错误,无法将其插入到数据库中,这对我来说似乎是合理的。有什么想法为什么没有自动增量,其次如何添加它们?我正在使用.NET Framework 4.6中的代码优先迁移,这是一个Winforms应用程序。


你提到了ASP.NET MVC 5,但是你还说它是一个Winforms应用程序,那到底是哪个呢?它不可能同时是两者... - marc_s
哦,糟糕,那是错误的,它是一个WinForm应用程序。 - Technology Researcher
它是WinForms可能与您的问题无关。我认为问题出在您的dbContext上。如果您将这些类和dbContext移动到简单的控制台应用程序中,是否会遇到相同的问题?您在dbContext中做了什么特殊的工作吗?您能否编辑问题:添加dbContext并显示如何将电影添加到数据库? - Harald Coppoolse
3个回答

7
您需要在ID列上添加以下两个属性:
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }

根据这篇博客:链接
如果您忘记在 C# 代码中明确指定 [Key],并且假设它不为空,则EF将尝试传递NULL,因为它是自增的,并会抛出异常“无法将值NULL插入列......”,所以可以将DatabaseGeneratedOption.Identity修改为DatabaseGeneratedOption.None--这可能无法满足自增需求。 因此,请保留[Key]并让DB生成器代替您填充它。 对于并发情况,这是一种可行的方法。
希望这回答了您的问题。

好的,这很奇怪,同样的问题无法将空值插入到ID中。我已经在所有类中添加了属性:电影,类型,演员。尽管错误来自演员。当我查看Microsoft SQL Server Manager时,它说ID,PK,INT,非空..我已经阅读了博客,不知道为什么它仍然会出现错误。 - Technology Researcher
我可能会在这里找到答案:https://dev59.com/kFoV5IYBdhLWcg3wgvDw#49711948。唯一的问题是,该页面上的SQL代码无法在使用Code First时添加,对吗?还是说我应该如何检查此代码?当修改ID列时,它已经声明了增量1、种子1和标识为True。 - Technology Researcher
DatabaseGeneratedOption.Identity用于自动递增。而DatabaseGeneratedOption.None用于主键但没有自动递增。所以我想这个答案应该会有所帮助。 - Manoj Choudhari
1
DatabaseGeneratedOption.Identity 是错误的选项。Identity 告诉 EF 数据库管理系统将生成 PK 值,因此它不应该(或者说:不能)发送它得到的 PK 值。但是,您的数据库管理系统不会创建 PK 值,但需要一个 PK 用于新添加的行。要么重新创建数据库以使列具有适当的自动增量,要么使用 DatabaseGeneratedOption.None 并提供自己的 PK。虽然按照代码优先约定,任何名为 Id 的属性都将被映射为 PK,但 [Key] 数据注释不应该是必需的。 - DevilSuichiro
1
好的,显然它起作用了。我删除了迁移文件夹,然后再次启用迁移,之后添加迁移并更新数据库。 - Technology Researcher
显示剩余7条评论

1

不行,主键和其他东西都正常工作,只有自动递增出了问题。即使我尝试在Microsoft SQL Manager中手动插入,它也会显示无法将空值插入ID,所以肯定不是自动递增的问题 :( - Technology Researcher
1
顺便说一下,下次请不要将你的回答仅限于链接。请在你的回答中发布任何相关文本。 - Doug F

0

当我使用Code First生成表时,我的表的主键定义是数据类型

double

因此,在生成表时,主键上没有标识。

所以我反转了迁移,并将数据类型更改为

integer

在这种情况下,表上的自动增量或标识被生成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接