在ASP.Net Core 2.1 Web API(带有MySQL数据库并使用Pomelo)中,如果我通过控制器操作之一将新实体添加到数据库中,则该API是从使用方接收到的客户端在主键中有一个值,似乎EF Core试图添加主键而不是允许数据库为其赋予新值。
因此...在数据库中,我有一个名为person
的表,该表具有一个名为id
的整数字段,该字段设置为PRIMARY KEY和AUTO-INCREMENT。
型号:
public partial class Person
{
public int? Id { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
}
DbContext:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>(entity =>
{
entity.ToTable("person");
entity.HasKey(e => e.Id);
entity.Property(e => e.Id)
.HasColumnName("id")
.HasColumnType("int(11)");
entity.Property(e => e.Name)
.HasColumnName("name")
.HasColumnType("varchar(45)");
entity.Property(e => e.Surname)
.HasColumnName("surname")
.HasColumnType("varchar(45)");
}
}
控制器操作
// POST: api/Person
[HttpPost]
public async Task<IActionResult> AddPerson([FromBody]Person person)
{
if (!ModelState.IsValid)
return BadRequest(ModelState);
_context.Person.Add(person);
await _context.SaveChangesAsync();
return CreatedAtAction("GetPerson", new { id = person.Id }, person);
}
如果在尝试将人的ID插入数据库之前没有明确清除其ID(即person.Id = null
),那么我会遇到一个异常,抱怨主键重复。这是正常的EF核心行为吗?还是我做错了什么?