无法更新Entity Framework Core中的标识列

时间:2016-08-26 23:42:17

标签: asp.net-core-mvc entity-framework-core

我在AspNetUsers表中添加了一个名为NumericId的单独标识,它将与ASP默认使用的GUID一起提供。

我已将该属性添加为ApplicationUser类的附加属性:

public class ApplicationUser : IdentityUser
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int NumericId { get; set; }
}

但是,当我尝试注册或更新用户的详细信息(甚至与numericId无关)时,我一直收到错误

SqlException: Cannot update identity column 'NumericId'.

可防止任何更改,但最终不会更新用户(但它会注册一个,并且在该部分上正确分配了数字ID。但这无关紧要)

8 个答案:

答案 0 :(得分:6)

asp.net core 3.1的解决方案

modelBuilder.Entity<Type>().Property(u => u.Property).Metadata.SetAfterSaveBehavior(PropertySaveBehavior.Ignore);

答案 1 :(得分:5)

根据此问题的discussion on GitHub,对于EF Core 2.0,我们需要使用其他帖子中建议的两条线。

  

for Entity framework core 2.0,&#34; IsReadOnlyAfterSave&#34;财产是   弃用。使用以下:

builder.Property(p => p.Id)
    .UseSqlServerIdentityColumn();

builder.Property(p => p.Id)
    .Metadata.AfterSaveBehavior = PropertySaveBehavior.Ignore;

答案 2 :(得分:4)

这是EF Core 1.0的一个错误。见EF trying to Insert into Identity field.

EF Core 1.2已将此问题标记为已修复,但未更新的解决方法是使用

modelBuilder.Entity<Type>().Property(u => u.Property).UseSqlServerIdentityColumn();

答案 3 :(得分:3)

如果您使用的是EF Core 2.1,则可以尝试。

builder.Property(e => e.ColumnName).Metadata.AfterSaveBehavior = PropertySaveBehavior.Ignore;

对我有用。

IsReadOnlyAfterSave已过时。

答案 4 :(得分:2)

这条线解决了我的问题。 可从1.1.1

获得
modelBuilder.Entity<ApplicationUser>().Property(u => u.NumberId).Metadata.IsReadOnlyAfterSave = true;

答案 5 :(得分:2)

我找到了另一个解决方案(我正在使用.NET Core 2.1):

using System;
using System.Collections.Generic;
using System.Diagnostics.Tracing;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Memory;
using YetAnotherERP.Data;
using YetAnotherERP.Entities;
using YetAnotherERP.Exceptions;
using YetAnotherERP.Utils;

namespace YetAnotherERP.Services
{
    public class EmployeeRepository : IEmployeeRepository
    {

    private DataContext _context;

    public EmployeeRepository(DataContext dataContext)
    {
        _context = dataContext;
    }


    ....


            public async Task UpdateEmployee(Employee employee)
        {
            _context.Update(employee).Property(x=>x.Id).IsModified = false;
            _context.SaveChanges();
        }

答案 6 :(得分:0)

使用3.1,关键是确保要更新的对象的标识值与数据库中记录的值匹配。因此,如果对象的ID为0,但数据库中相应行的ID为99,则在尝试保存该对象之前,请确保将其ID值设置为99。

答案 7 :(得分:0)

其实这是实体框架自己创建主键造成的 虽然我们在 userIdentity 中有一个 Id 列 我在 DBContext 中的 onModelCreation 函数中解决了这个问题

       base.OnModelCreating(modelBuilder);