我已经创建了一个新的ASP.NETCore2.1WebAPI。它使用EF Core(代码优先)读取和写入sqlserver数据库。所以我使用迁移来生成/构建数据库。
在控制器中的[HTTPPOST]操作方法上,当它向DbContext添加新记录并尝试保存时,出现以下错误:
System.Data.SqlClient.SqlException(0x80131904):无法插入
表'Readings'中标识列的显式值
IDENTITY\u INSERT设置为OFF。
数据库只有一个表:
USE [eballcoz_mssql]
GO
/****** Object: Table [eballcoz_admin].[Readings] Script Date: 2018/11/08 21:13:34 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [eballcoz_admin].[Readings](
[Id] [int] IDENTITY(1,1) NOT NULL,
[BaseId] [int] NULL,
[Frequency] [int] NULL,
[Modulation] [int] NULL,
[Agc1] [int] NULL,
[Agc2] [int] NULL,
[TimeStamp] [datetime2](7) NULL,
CONSTRAINT [PK_Readings] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
我的模型是这样的:
public class Reading
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int? BaseId { get; set; }
public int? Frequency { get; set; }
public int? Modulation { get; set; }
public int? Agc1 { get; set; }
public int? Agc2 { get; set; }
public DateTime? TimeStamp { get; set; }
}
我的动作方法是这样的:
// POST: api/Readings/one
[HttpPost]
public async Task<IActionResult> PostReading([FromBody] Reading reading)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
_context.Readings.Add(reading);
await _context.SaveChangesAsync();
return CreatedAtAction("GetReading", new { id = reading.Id }, reading);
}
我理解问题所在—我的模型包含“Id”主键字段,因此它试图将其写入数据库表,而SQL Server不喜欢这样。问题是,当我从数据库读取数据时,我需要模型中的“Id”字段。我本以为
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
模型中的decorator会告诉EF它不应该尝试插入Id列,但它似乎不起作用。我也试着用流利的语言来表达:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Reading>()
.HasKey(r => r.Id);
modelBuilder.Entity<Reading>()
.Property(r => r.Id)
.UseSqlServerIdentityColumn()
.ValueGeneratedOnAdd();
}
基本上有两种不同的方法可以插入记录而不会出错:
2) 当IDENTITY\U INSERT设置为ON时。主键“ID”必须存在
所以我基本上是在尝试解决方案1—我不想提供主键值。我希望SQL Server自动为我生成它。但我的模型确实包含Id列,因为我在从数据库读取时需要它。。。有什么想法吗?