为什么EF核心忽略自动增量列并尝试更新?

时间:2017-06-29 01:05:10

标签: c# asp.net-core entity-framework-core

在mssql数据库中,我有一个名为 AutoIncrementNumber 的自动增量列 配置了这个提到的

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
   modelBuilder.Entity<User>(entity =>
   {
      entity.Property(e =>e.AutoIncrementNumber).ValueGeneratedOnAdd();
    }
}

我添加了一个新用户并希望更新此

    var user = new User { UserName = "SomeUserName", Code=0};
    var result = await _userManager.CreateAsync(user, "SomePassword");

    //after CreateAsync user.AutoIncrementNumber == 1

    if (result.Succeeded)
    {
      user.Code = 1;
      userManager.UpdateAsync(user);
    }

但在UpdateAsync期间我遇到了错误

DbUpdateException:更新条目时发生错误。有关详细信息,请参阅内部异常 SqlException:无法更新标识列&#39; AutoIncrementNumber&#39;

项目正在.net core 1.1下运行

SQL架构

CREATE TABLE [dbo].[AspNetUsers](
    [Id] [nvarchar](450) NOT NULL,
    [UserName] [nvarchar](256) NULL,
    [AutoIncrementNumber] [int] IDENTITY(1,1) NOT NULL,
    [ReferralCode] [nvarchar](50) NULL,
    CONSTRAINT [PK_AspNetUsers] PRIMARY KEY CLUSTERED (
        [Id] ASC )WITH (
            PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
            IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
            ALLOW_PAGE_LOCKS = ON
        ) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

1 个答案:

答案 0 :(得分:4)

ValueGeneratedOnAdd表示数据库在插入对象时生成,插入时应忽略该属性。

您应该使用ValueGeneratedOnAddOrUpdate来指定该值也应该从UPDATE中排除。

使用数据注释,相当于ValueGeneratedOnAddOrUpdate的是[DatabaseGenerated(DatabaseGeneratedOption.Computed)]。等同于ValueGeneratedOnAdd的是[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

检查Microsoft Docs中的Generated Values部分。