【发布时间】:2021-04-25 05:52:52
【问题描述】:
我正在尝试在名为 MembershipID 的身份用户表上创建一个自动递增字段,但我遇到了一些问题。
我将身份用户子类化并创建了自己的“ApplicationUser”,因此我可以添加其他字段,这一切都很好。
ApplicationUser.cs
public class ApplicationUser : IdentityUser
{
public int Currency { get; set; }
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int membershipID { get; set; }
public string Name { get; set; }
}
(注意 - 我尝试了使用和不使用 [key] 注释)。
问题 该字段在模型创建时生成并自动递增。但是,每次我更新模型时,比如说名称,我都会收到一条错误消息:
SqlException:无法更新标识列“membershipID”。
这是为什么呢?我认为通过说它是数据库生成的值它不会这样做吗?如何防止它更新列?我不是在尝试编辑自动递增的字段,而是在编辑另一列,但不知何故它也尝试更新导致问题的其他字段。
谢谢大家。
【问题讨论】:
-
要么删除
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]属性,要么在插入时不明确给出membershipID。 Sql 不允许用户在启用身份的列上传递值 -
我不想更新或更改它,但如果我更改模型中的另一个字段(比如名称),它也会尝试更改该字段(我不希望它这样做)
-
我很困惑。您的班级是“IdentityUser”,而该表称为“名为 MembershipID 的表”?但是类中的字段是int?它是在ApplicationUser中定义的?
-
您应该发布您所涉及的代码以表明它不会触及
membershipID。该错误清楚地表明这种情况发生了变化。问题不在于如何防止它,您需要找出它是如何为什么被修改的。 -
更新实体时,对于Identity列,我们应该忽略设置或更改的值。正如 Dionis Takac 所说,您可以在 ApplicationDbContext 的 OnModelCreating 方法中添加
builder.Entity<ApplicationUser>().Property(u => u.membershipID).Metadata.SetAfterSaveBehavior(PropertySaveBehavior.Ignore);。或者在更新实体时将属性的 IsModified 属性设置为 false,代码如下:var user = //find exist user from database; // update the name _context.Update(user).Property(c => c.membershipID).IsModified = false; _context.SaveChanges();
标签: c# asp.net .net sql-server asp.net-core