我在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。但这无关紧要)
答案 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);