Автоинкремент Int Id не вставлен в связанные элементы

Обычно я использую Guid в качестве идентификатора, но в этом проекте я должен использовать идентификатор int, поэтому мой опыт здесь немного скуден.

Моя проблема в том, что мой автоинкрементный идентификатор int не получает значение OnAdd, которое я могу использовать для связанных элементов, прежде чем сохранять изменения.

Пример:

var box = new Box
{
   Name = "Some name"
}
_dbContext.Add(box);

var boxItem = new BoxItem
{
    BoxId = box.Id, // This will be 0 on save
    Name = "Some other name"
}
_dbContext.Add(boxItem);

await _dbContext.SaveChangesAsync();

Когда я просматриваю свою базу данных после сохранения, boxItem.BoxId равен 0. При работе с Guid это сгенерированное значение Box.Id.

Модели:

public class Box
{

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string Name { get; set; }

    public IList<BoxItem> BoxItems { get; set; }

}

public class BoxItem
{

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public int BoxId { get; set; }
    public string Name { get; set; }

}

Столбец Id имеет спецификацию Identity/Identity = yes и приращение Identity = 1 в базе данных MSSQL.

Я не знаю, это ограничение при работе с int Id или у меня неправильная настройка?


person Mads    schedule 18.06.2021    source источник
comment
_dbContext.Add(box); не записывает данные в базу данных и не генерирует идентификатор. dbContext.SaveChangesAsync(); запишет данные и сгенерирует значение для ID автоинкремента.   -  person Chetan Ranpariya    schedule 18.06.2021
comment
@ChetanRanpariya, поэтому я должен вызывать SaveChanges после _dbContext.Add(box) и снова после _dbContext.Add(boxItem)? Я знаю, что моя установка будет работать с Guid, но отличается ли она от int Id?   -  person Mads    schedule 18.06.2021
comment
Вы можете либо вызвать SaveChanges дважды, либо правильно сопоставить сущности в EF. stackoverflow.com/questions/6922690/   -  person Chetan Ranpariya    schedule 18.06.2021
comment
@ChetanRanpariya Я бы не хотел дважды вызывать SaveChanges. Но я не вижу, как мои объекты, основанные на соглашениях, отображаются неправильно?   -  person Mads    schedule 18.06.2021


Ответы (1)


Я не знаю, правильный ли это подход, но я решил это следующим образом:

var box = new Box
{
   Name = "Some name"
}
box.BoxItems = new List<BoxItem>(); // Line added

var boxItem = new BoxItem
{
    BoxId = box.Id,
    Name = "Some other name"
}
box.BoxItems.Add(boxItem);

_dbContext.Add(box); // Adding the box here with box.BoxItems instead

await _dbContext.SaveChangesAsync();
person Mads    schedule 18.06.2021