Что заставляет идентификаторы новых элементов увеличиваться автоматически (DbContext + InMemoryDatabase ядра asp.net)? - PullRequest
0 голосов
/ 21 сентября 2018

Я изучаю ASP.NET Core, следуя этому руководству , и замечаю следующее поведение метода POST.

enter image description here

Мой вопрос:

Что конкретно делает id вновь созданного элемента автоматически увеличивающимся?(Для простоты я использую базу данных в памяти, как предложено в учебном пособии.)


<--------- Ниже приведены связанные фрагменты кода, такие же каккод в учебнике ------------->

Контекст и сущность:

TodoItem.cs

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 (POST метод)

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

Startup.cs

ConfigureServices метод в Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<TodoContext>(opt => opt.UseInMemoryDatabase("TodoList"));
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Это стандартное поведение EF.

Разница между традиционной базой данных и базой данных In-Memory заключается только в том, что в базе данных In-Memory (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; }
}

Ссылка: Value Generation Patterns In EF Core

0 голосов
/ 21 сентября 2018

По умолчанию, что делает Entity Framework.Когда он находит идентификатор или связанное с ним поле имени, он устанавливает его в качестве первичного ключа таблицы.По умолчанию автоинкрементный.Если вы не хотите, чтобы это было сделано по умолчанию, вы можете использовать атрибут ниже для поля Id:

 [DatabaseGenerated(DatabaseGeneratedOption.None)]

Подробнее о сгенерированных значениях

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...