【问题标题】:Erro: Cannot insert explicit value for identity column in table - INT to tinyInt错误:无法为表中的标识列插入显式值 - INT 到 tinyInt
【发布时间】:2018-09-21 14:52:10
【问题描述】:

我正在开发一个 ASP .NET WEB EF 项目。尝试使用“Update-Migration”更新数据库时出现此错误。

它说:错误号:544,状态:1,类:16 当 IDENTITY_INSERT 设置为 OFF 时,无法在表“流派”中插入标识列的显式值。

其他人之前也遇到过这个问题。 我试图在这个网站上应用其他人在这个问题上建议的方法。在这些解决方案中,一个可能是解决我的问题的方法是我为表的 PK 键入 tinyInt。这是有道理的,因为我已经通过 [Required] 数据注释对其进行了更改。

问题:如何将其改回 INT 类型或简单地解决此问题?

我遵循的建议的链接是: EF Code First giving me error Cannot insert explicit value for identity column in table 'People' when IDENTITY_INSERT is set to OFF.

在线程的底部提到了设置:this.Property(t => t.TableID).HasColumnName("TableID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

但没有提到在哪里?我使用 VS 2017。

这是流派类:

 public class Genre
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

    public int ID { get; set; }

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

这是我创建的空白迁移,然后用 sql 代码填充:

    // <auto-generated />

using System.ComponentModel.DataAnnotations.Schema;

namespace MyNotes.Migrations
{
    using System.CodeDom.Compiler;
    using System.Data.Entity.Migrations.Infrastructure;
    using System.Resources;

    [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")]
    public sealed partial class PopulateGenresTable : IMigrationMetadata
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

        private readonly ResourceManager Resources = new ResourceManager(typeof(PopulateGenresTable));

    string IMigrationMetadata.Id
    {
        get { return "201809211642586_PopulateGenresTable"; }
    }

    string IMigrationMetadata.Source
    {
        get { return null; }
    }

    string IMigrationMetadata.Target
    {
        get { return Resources.GetString("Target"); }
    }
    }
}

在创建此文件的更改后尝试运行 Update-Database 时出现错误:

namespace MyNotes.Migrations
{
    using System.Data.Entity.Migrations;

    public partial class PopulateGenresTable : DbMigration
    {
        public override void Up()
        {
            Sql("INSERT INTO Genres (ID, Name) VALUES (1,'Medicine')");
            Sql("INSERT INTO Genres (ID, Name) VALUES (2,'Philosophy')");

        }

        public override void Down()
        {
            Sql("DELETE FROM Genres WHERE ID IN(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31)");
        }
    }
}

【问题讨论】:

    标签: c# database


    【解决方案1】:

    因为您将 ID 声明为自动生成的列,SQL Server 不允许您专门为此列插入值。所以你应该添加如下记录:

    Sql("INSERT INTO Genres (Name) VALUES ('Medicine')");
    Sql("INSERT INTO Genres (Name) VALUES ('Philosophy')");
    

    【讨论】:

    • 太棒了!它至少有助于无错误地更新数据库,但现在我没有设置使用这些值填充的数据库。
    • 第二个问题是 down() 方法。不提身份证怎么参考?
    • 对于Down() 方法的关注:您可以简单地DELETE FROM Genres 删除表中的所有记录。关于丢失的记录,您是否在寻找正确的数据库?
    • 另外,当您执行Update-Database 命令时,您是否看到正在应用您的迁移 PopulateGenresTable?
    • 我建议你关闭VS,删除packages、obj、bin文件夹,然后重新打开解决方案,让它恢复packages并重新构建
    【解决方案2】:

    将此添加到您的模型属性中,以便它为您处理自动递增。

    [ScaffoldColumn(false)]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    

    【讨论】:

    • 我已将 [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 添加到类 Genre 中,但仍然出现相同的错误。
    • 它需要进入您正在自动递增的类的属性。
    • 它说:错误号:544,状态:1,类:16 当 IDENTITY_INSERT 设置为 OFF 时,无法在表“流派”中插入标识列的显式值。
    • 你的意思是它应该进入 public class Genre { } 对吗?但它对这个问题没有帮助。还是一模一样!
    • 我分享了代码。在up()方法中,sql()的代码行比较多,这里我就简单说一下吧。
    猜你喜欢
    • 2015-07-02
    • 2016-04-13
    • 2015-10-27
    • 2012-06-25
    • 1970-01-01
    • 2011-06-14
    相关资源
    最近更新 更多