Совместное использование таблицы с помощью Entity Framework Core - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть несколько объектов, которые я хотел бы разделить одну таблицу «Изображения». Например, продукты могут иметь список изображений, а категории могут иметь список изображений. Я хотел бы использовать enum "EntityType", чтобы отличить, какой это тип сущности. Мое решение ниже не работает, потому что есть ошибка внешнего ключа, когда я пытаюсь вставить изображение с EntityId, который может существовать в категории, но не в продукте. Это имеет смысл, поскольку приведенное ниже решение не учитывает «EntityType». Есть ли рекомендации, как мне это сделать? Я знаю, что могу использовать «ProductId», «CategoryId» и т. Д. Вместо «EntityId», но у меня будет много сущностей, поэтому я бы предпочел не делать этого таким образом.

public class Product
{
    public int Id { get; set; }
        public List<Image> ProductImages { get; set; }
}
public class Category
{
    public int Id { get; set; }
        public List<Image> CategoryImages { get; set; }
}
public class Image
{
        public int EntityId { get; set; }
        public EntityType EntityType { get; set; }
        public string ImageUrl { get; set; }
        public Product Product { get; set; }
        public Category Category { get; set; }
}

modelBuilder.Entity<Product>().ToTable("Product");
modelBuilder.Entity<Category>().ToTable("Category");

modelBuilder.Entity<Image>().ToTable("Image");
modelBuilder.Entity<Image>().HasOne(p => p.Product).WithMany(p => p.ProductImages).HasForeignKey(p => p.EntityId);
modelBuilder.Entity<Image>().HasOne(p => p.Category).WithMany(p => p.CategoryImages).HasForeignKey(p => p.EntityId);

1 Ответ

0 голосов
/ 09 апреля 2019

То, что вы описываете, является отношением многих ко многим.Для этого вам понадобится объект, который будет отслеживать указанные отношения:

public class ProductImage
{
    [ForeignKey(nameof(Product))]
    public int ProductId { get; set; }
    public Product Product { get; set; }

    [ForeignKey(nameof(Image))]
    public int ImageId { get; set; }
    public Image Image { get; set; }
}

В ваших Product / Category классах:

public ICollection<ProductImage> ProductImages { get; set; }

Затем для вашей свободной конфигурации:

modelBuilder.Entity<ProductImage>().HasOne(p => p.Product).WithMany(p => p.ProductImages);
modelBuilder.Entity<ProductImage>().HasOne(p => p.Image).WithMany();

Сделайте то же самое со своими категориями.

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