C# 是什么使新项目的ID自动增加(asp.net core的DbContext和InMemoryDatabase)?

C# 是什么使新项目的ID自动增加(asp.net core的DbContext和InMemoryDatabase)?,c#,entity-framework,asp.net-core,asp.net-core-mvc,asp.net-core-webapi,C#,Entity Framework,Asp.net Core,Asp.net Core Mvc,Asp.net Core Webapi,我正在学习ASP.NET Core following,我注意到POST方法的以下行为 我的问题: 具体是什么使新创建的项目的id自动递增?(为了简单起见,我使用了教程中建议的内存数据库。) 上下文和实体: TodoItem.cs namespace TodoApi.Models { 公共类待办事项 { 公共长Id{get;set;} 公共字符串名称{get;set;} 公共bool IsComplete{get;set;} } } TodoContext.cs 使用Microsoft.

我正在学习ASP.NET Core following,我注意到
POST
方法的以下行为

我的问题: 具体是什么使新创建的项目的
id
自动递增?(为了简单起见,我使用了教程中建议的内存数据库。)


上下文和实体: TodoItem.cs

namespace TodoApi.Models
{
公共类待办事项
{
公共长Id{get;set;}
公共字符串名称{get;set;}
公共bool IsComplete{get;set;}
}
}
TodoContext.cs

使用Microsoft.EntityFrameworkCore;
命名空间TodoApi.Models
{
公共类TodoContext:DbContext
{
公共TodoContext(DbContextOptions选项):基本(选项){}
公共DbSet TodoItems{get;set;}
}
}
控制器: TodoController.cs(
POST
method)

命名空间TodoApi.Controllers
{
[路由(“api/[控制器]”)]
[ApiController]
公共类TodoController:ControllerBase
{
私有只读TodoContext\u上下文;
公共TodoController(TodoContext上下文)
{
_上下文=上下文;
}
[HttpPost]
公共操作结果创建(TodoItem项)
{
_context.TodoItems.Add(项);
_SaveChanges();
返回CreatedAtRoute(“GetTodo”,new{id=item.id},item);
}
}
}
Startup.cs
ConfigureServices
Startup.cs中的方法

public void配置服务(IServiceCollection服务)
{
services.AddDbContext(opt=>opt.UseInMemoryDatabase(“TodoList”);
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

实体框架的默认功能。当他找到一个Id或相关的名称字段时,他将其设置为表的主键。默认情况下,它是自动增量的。如果您不希望在默认情况下执行此操作,则可以对Id字段使用以下属性:

 [DatabaseGenerated(DatabaseGeneratedOption.None)]

实体框架的默认功能。当他找到一个Id或相关的名称字段时,他将其设置为表的主键。默认情况下,它是自动增量的。如果您不希望在默认情况下执行此操作,则可以对Id字段使用以下属性:

 [DatabaseGenerated(DatabaseGeneratedOption.None)]

这是EF的默认行为

传统数据库和内存数据库之间的区别在于,内存数据库(IMDB,也称为主内存数据库或MMDB)是一种数据库,其数据存储在主内存中,以便在传统数据库不支持的情况下加快响应时间

总之,EF行为适用于这两个数据库

根据所使用的数据库提供程序,可以通过EF在客户端或在数据库中生成值。如果该值由数据库生成,则在将实体添加到上下文时,EF可能会分配一个临时值。然后,在SaveChanges()期间,此临时值将被数据库生成的值替换

如果将实体添加到具有指定给属性的值的上下文中,则EF将尝试插入该值,而不是生成新值

您可以通过三种不同的方式设置价值生成

1) 没有价值产生

public class TodoItem 
{
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public long Id { get; set; }
    public string Name { get; set; }
    public bool IsComplete { get; set; }
}
2) 增值

public class TodoItem 
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long Id { get; set; }
    public string Name { get; set; }
    public bool IsComplete { get; set; }
}
3) 添加或更新时生成的值

public class TodoItem 
{        
    public long Id { get; set; }
    public string Name { get; set; }
    public bool IsComplete { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public DateTime LastUpdated { get; set; }
}

参考:

这是EF的默认行为

传统数据库和内存数据库之间的区别在于,内存数据库(IMDB,也称为主内存数据库或MMDB)是一种数据库,其数据存储在主内存中,以便在传统数据库不支持的情况下加快响应时间

总之,EF行为适用于这两个数据库

根据所使用的数据库提供程序,可以通过EF在客户端或在数据库中生成值。如果该值由数据库生成,则在将实体添加到上下文时,EF可能会分配一个临时值。然后,在SaveChanges()期间,此临时值将被数据库生成的值替换

如果将实体添加到具有指定给属性的值的上下文中,则EF将尝试插入该值,而不是生成新值

您可以通过三种不同的方式设置价值生成

1) 没有价值产生

public class TodoItem 
{
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public long Id { get; set; }
    public string Name { get; set; }
    public bool IsComplete { get; set; }
}
2) 增值

public class TodoItem 
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long Id { get; set; }
    public string Name { get; set; }
    public bool IsComplete { get; set; }
}
3) 添加或更新时生成的值

public class TodoItem 
{        
    public long Id { get; set; }
    public string Name { get; set; }
    public bool IsComplete { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public DateTime LastUpdated { get; set; }
}

参考资料:

@Liutong Chen,查看答案可能对您有帮助:)非常感谢您的详细解释!很高兴听到你得到了你想要的:)@Liutong Chen,查看答案可能对你有帮助:)非常感谢你的详细解释!很高兴听到你得到了你想要的:)