【问题标题】:.NET 5 - Prevent update on auto-increment column?.NET 5 - 防止更新自动增量列?
【发布时间】: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


【解决方案1】:

我发现之前有人报告过类似的问题。如果您使用核心 3.1,请尝试在您的 OnModelCreating 方法中添加类似的内容:

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

这是类似的问题 - cannot update identity column in Entity Framework Core。您可以在那里找到早期版本核心的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2021-06-02
    相关资源
    最近更新 更多