代码之家  ›  专栏  ›  技术社区  ›  Liutong Chen

是什么使新项的ID自动递增(asp.net core的DbContext+InMemoryDatabase)?

  •  0
  • Liutong Chen  · 技术社区  · 6 年前

    我正在学习ASP.NET核心 this tutorial 我注意到 POST

    enter image description here

    我的问题是:

    是什么使 id


    <---------以下是相关的代码段,与教程中的代码相同---------------->

    上下文和实体:

    namespace TodoApi.Models 
    {
        public class TodoItem 
        {
            public long Id { get; set; }
            public string Name { get; set; }
            public bool IsComplete { get; set; }
        }
    }
    

    TodoContext.cs文件

    using Microsoft.EntityFrameworkCore;
    
    namespace TodoApi.Models 
    {
        public class TodoContext : DbContext 
        {
            public TodoContext(DbContextOptions<TodoContext> options) : base(options) {}
    
            public DbSet<TodoItem> TodoItems { get; set; }
        }
    }
    

    控制器:

    TodoController.cs( 方法)

    namespace TodoApi.Controllers 
    {
        [Route("api/[controller]")]
        [ApiController]
        public class TodoController : ControllerBase 
        {
            private readonly TodoContext _context;
            public TodoController(TodoContext context)
            {
                _context = context;
            }
    
            [HttpPost]
            public ActionResult<TodoItem> Create(TodoItem item) 
            {
                _context.TodoItems.Add(item);
                _context.SaveChanges();
                return CreatedAtRoute("GetTodo", new { id = item.Id }, item);
            }
        }
    }
    

    ConfigureServices

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<TodoContext>(opt => opt.UseInMemoryDatabase("TodoList"));
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   er-sho    6 年前

    这是EF的默认行为。

    传统数据库和内存数据库的区别仅仅在于内存数据库(IMDB,也称为内存数据库或MMDB)是一种数据库,它的数据存储在内存中,以加快响应速度,而传统数据库没有这样做。

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

    如果您向上下文中添加了一个实体,并为该属性指定了一个值,那么EF将尝试插入该值,而不是生成一个新值。

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

    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; }
    }
    

    Value Generation Patterns In EF Core

        2
  •  1
  •   Kacper Werema    6 年前

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

     [DatabaseGenerated(DatabaseGeneratedOption.None)]
    

    Read more about generated values