使用带有代码优先的实体框架,没有自动增量

Posted

技术标签:

【中文标题】使用带有代码优先的实体框架,没有自动增量【英文标题】:Using Entity Framework with code-first no autoincrement 【发布时间】:2019-08-11 15:34:24 【问题描述】:
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 为 null 并且无法插入数据库的错误,这对我来说似乎是合乎逻辑的。任何想法为什么没有任何自动增量,其次我如何添加它们?我在 .NET Framework 4.6 中使用代码优先迁移,它是一个 Winforms 应用程序。

【问题讨论】:

你提到了 ASP.NET MVC 5 - 但你也说它是一个 WInforms 应用程序 - 现在是什么?我不能同时是两个..... 哎呀,错了,这是一个winform应用程序 它是winforms 可能与你的问题无关。我认为它在您的 dbContext 中。如果您将这些类和您的 dbContext 移动到一个简单的控制台应用程序,您会遇到同样的问题吗?你在你的 dbContext 中做了什么特别的事情吗?您能否编辑问题:添加 dbContext 并展示如何将电影添加到数据库? 【参考方案1】:

您必须在 ID 列上放置以下两个属性

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id  get; set; 

据此blog:

如果您忘记提及 [Key] ,假设您已使其不为空,并在 C# 代码中明确说 > Id,EF 将尝试传递 NULL,因为 它是一个身份,会抛出异常“无法插入值 NULL into column……….“,所以可以修改 DatabaseGeneratedOption.Identity 到 DatabaseGeneratedOption.None – 这可能无法满足自动增量的需求。所以,只要保持 [Key] 并让数据库生成器为您填充它。这是当它的方法 涉及并发。

我希望这能回答您的问题。

【讨论】:

那是新的吗?因为我有另一个应用程序,其中没有这些属性,并且该应用程序运行良好。但是谢谢。 这可能是 EF 版本特定的问题。您可以在这些不同的应用程序中检查版本。 好吧,这很奇怪,同样的问题不能在 id 中插入 null。我在所有类中都添加了这两个属性:电影、流派、演员表。尽管错误来自 Cast 。当我查看 microsoft sql server manager 时,它显示 id、Pk、int,而不是 null .. 我已经阅读了博客,但不知道为什么它仍然给出错误 DatabaseGeneratedOption.Identity 是错误的。 Identity 告诉 EF DBMS 将生成 PK 值,因此它不应该(或者更确切地说:不能)发送它获得的 PK 值。但是,您的 DBMS 不会创建 PK 值,但需要为新添加的行创建 PK。重新创建数据库以使列具有适当的自动增量,或者使用 DatabaseGeneratedOption.None 并提供您自己的 PK。但是,[Key] 数据注释应该不是必需的,因为任何名为 Id 的属性都将根据代码优先约定映射为 PK。 显然它奏效了。我删除了迁移文件夹,然后在添加迁移和更新数据库之后再次启用迁移。【参考方案2】:

以下文章解释了 EF 6 和 EF Core 中 Key 属性的使用。

http://www.entityframeworktutorial.net/code-first/key-dataannotations-attribute-in-code-first.aspx

【讨论】:

nope 主键和东西工作正常,它只是自动递增。即使我尝试在 microsoft sql manager 中手动插入它也说不能将 null 插入 id 所以肯定没有自动增量:( 顺便说一句,下次尽量不要让您的答案成为仅链接的答案。请在您的答案中发布任何相关文字。【参考方案3】:

当我首先使用代码生成我的表时,我的表上的主键的定义是数据类型

双重

因此,当生成表时,主键上不存在标识。

所以我做的是反向迁移,并将数据类型更改为

整数

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

【讨论】:

以上是关于使用带有代码优先的实体框架,没有自动增量的主要内容,如果未能解决你的问题,请参考以下文章

使用实体框架自动编号

使用带有实体框架代码优先和 ASP.NET MVC 3 和 mvc miniprofiler 的 SQL Server CE 时出现问题

在不修改实体类(注释)或数据上下文(使用 fluentapi)的情况下禁用标识(自动递增)

如何从实体框架代码优先方法自动增加 oracle 表?

实体框架模型优先:以编程方式创建 UNIQUE 约束

如何使用带有代码优先实体框架的 UnitOfWork 模式防止重复条目?