EF Core, первичный ключ не генерируется автоматически для сущности, наследуемой от ICollection - PullRequest
0 голосов
/ 24 октября 2018

Вот моя сущность:

public class StackImage: ICollection<StackFile>
{

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual Guid Id { get; set; }

    private IList<StackFile> StackFiles { get; set; } = new List<StackFile>();

    public StackImage()
    {

    }

    [...] // Implementation of ICollection

}

public class StackFile
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual Guid Id { get; set; }
    public string Url { get; set; }
    public int Position { get; set; }

    public StackFile(){}
}

stackImage.Add(new StackFile(url));
stackImage= await _stackImageRepository.UpdateAsync(stackImage);
await _unitOfWork.SaveChangesAsync();

В этом примере после UpdateAsync идентификатор StackImage не генерируется (stackImage.Id == по умолчанию), но идентификатор StackFile генерируется правильно (stackImage [0].Id == по умолчанию)

Вы уже заметили эту проблему?Я предполагаю, что EF Core видит StackImage в виде списка и не пытается создать новый Guid.Как решить эту проблему?

РЕДАКТИРОВАТЬ : Из того, что я могу прочитать в Интернете и по полученным ответам, кажется, что это невозможно.Если у кого-то есть решение, пожалуйста, сообщите нам:)

1 Ответ

0 голосов
/ 25 октября 2018

Мне кажется, что вы хотите создать базу данных с (как минимум) двумя таблицами.Таблица с StackImages и таблица с StackFiles.

Вы хотите создать отношение один-ко-многим между StackImages и StackFiles: каждый StackImage имеет ноль или более StackFiles каждый StackFile принадлежит ровно одному StackImage.В базе данных это реализовано с использованием внешнего ключа.

Следовательно, неверно, что StackImage является StackFile .Тем не менее, вы можете сказать, что у StackImage есть несколько StackFiles.

В соответствии с первыми соглашениями кода структуры сущностей ваши классы должны быть похожи на:

class StackImage
{
    public Guid Id {get; set;}
    ...

    // every StackImage has zero or more StackFiles (one-to-many):
    public virtual ICollection<StackFile> StackFiles {get; set;}
}
class StackFile
{
    public Guid Id {get; set;}
    ...

    // every StackFile belongs to exactly one StackImage, using foreign key:
    public Guid StackImageId {get; set;}
    public virtual StackImage StackImage {get; set;}
}

наконец, DbContext:

class MyDbcontext : DbContext
{
    public DbSet<StackImage> StackImages {get; set;}
    public DbSet<StackFile> StackFiles {get; set;}
}

Обратите внимание на использование виртуальных свойств для выражения связей между таблицами.Поскольку внешний ключ StackImageId должен быть реальным столбцом, он не является виртуальным

В структуре сущностей столбцы таблицы представлены не виртуальными свойствами, виртуальные свойства представляют отношениямежду таблицами.

Поскольку я следовал соглашениям, нет необходимости ни в атрибутах, ни в беглости API.Платформа Entity Framework определяет коллекцию «один ко многим» и создает для вас подходящие таблицы.Только если вам нужны разные идентификаторы для ваших таблиц или столбцов, вам потребуется свободный API или атрибуты.

...