【问题标题】:Auto Increment ID in ASP.NET MVCASP.NET MVC 中的自动增量 ID
【发布时间】:2017-09-06 02:47:00
【问题描述】:

我正在尝试向表中添加记录并自动生成主键。我在 SQL Server 中有 StudentID 列作为主键,int, not null。我不断收到此错误:

SqlException:无法将值 NULL 插入到列“学生 ID”、表“SchoolManagement.dbo.Student”中;列不允许空值。插入失败。 该语句已终止。

模特(Student.CS):

namespace SchoolChallenge.Models
{
    public partial class Student
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int StudentId { get; set; }
        public string StudentNumber { get; set; }
        [RegularExpression(@"^[a-zA-Z]+$", ErrorMessage = "Use letters only please")]
        public string FirstName { get; set; }
        [RegularExpression(@"^[a-zA-Z]+$", ErrorMessage = "Use letters only please")]
        public string LastName { get; set; }
        [RegularExpression(@"^[a-zA-Z]+$", ErrorMessage = "Use letters only please")]
        public string HasScholarship { get; set; }
    }
}

控制器 (StudentsController):

// POST: Students/Create
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("StudentId,StudentNumber,FirstName,LastName,HasScholarship")] Student student)
{
    if (ModelState.IsValid)
    {
        _context.Add(student);
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }

    return View(student);
}

SchoolManagementContext.cs:

modelBuilder.Entity<Student>(entity =>
{
    entity.Property(e => e.StudentId)
        .HasColumnName("Student ID")
        .ValueGeneratedOnAdd();

    entity.Property(e => e.FirstName)
        .IsRequired()
        .HasColumnName("First Name")
        .HasMaxLength(50);

    entity.Property(e => e.HasScholarship)
        .IsRequired()
        .HasColumnName("Has Scholarship")
        .HasColumnType("nchar(10)");

    entity.Property(e => e.LastName)
        .IsRequired()
        .HasColumnName("Last Name")
        .HasMaxLength(50);

    entity.Property(e => e.StudentNumber).HasColumnName("Student Number");
});

【问题讨论】:

  • 您使用的是database first还是code first
  • 数据库优先。我需要在 MSSQL 中设置身份吗?
  • 是的。你应该这样做。
  • 如果您使用 Code First,请尝试 modelBuilder.Entity&lt;Student&gt;(...).HasKey(p =&gt; p.StudentId).Property(p =&gt; p.StudentId).StoreGeneratedPattern = StoreGeneratedPattern.Identity;。如果使用 DB First,请尝试将 StudentId 列设置为 IDENTITY (1, 1) 并且不要忘记在 EDMX 文件中将 StoreGeneratedPattern 设置为 Identity
  • 在您的 Create 方法中,您是否尝试过从 Bind 属性中删除 StudentId 属性?

标签: c# sql-server entity-framework


【解决方案1】:

如果您的代码未提供学生 ID,那么您必须将其作为表中的身份字段。

确保学生 ID 字段在表格设计中具有此功能。

IDENTITY (1,1) 

这将在插入行时自动在数据库中为您生成学生 ID,并为每个新行将 ID 增加 1。

我不相信您可以在制作 iirc 后制作列标识。所以要么删除表并重新创建,要么删除不正确的列并替换为正确的列。

所以要删除一列并添加一个新列:

Alter TABLE dbo.t_name drop column studentID

然后:

Alter TABLE dbo.t_name add studentID int IDENTITY(1,1) NOT NULL

【讨论】:

  • 如果您也可以为 OP 提供更改脚本会更好,因为我认为表已经创建
【解决方案2】:

我在 SQL Server 中将主键的IdentityNo 更改为Yes,现在它会自动递增,并且不会显示错误。

【讨论】:

    【解决方案3】:

    如果您使用的是 Visual Studio,则可以通过打开表定义来编辑主 ID。打开服务器资源管理器,右键单击表,然后选择“打开表定义”。在底部的“设计”选项卡下,添加或编辑以下内容:

    CONSTRAINT [PK_dbo.TableName] PRIMARY KEY CLUSTERED ([ID] ASC)
    

    【讨论】:

    • 这不是问题。而且PK已经存在了。
    猜你喜欢
    • 2020-06-17
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    相关资源
    最近更新 更多