У меня есть несколько объектов, которые я хотел бы использовать в одной таблице «Изображения». Например, продукты могут иметь список изображений, а категории могут иметь список изображений. Я хотел бы использовать перечисление «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);
То, что вы описываете, - это отношения «многие ко многим». Для этого вам понадобится объект для отслеживания указанной связи:
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();
Сделайте то же самое с вашими категориями.
Я не совсем уверен, пытаюсь ли я сделать многие ко многим. Мне просто нужен продукт, который ссылается на таблицу изображений. Одно изображение к одному продукту. Затем я хочу, чтобы таблица категорий делала то же самое. Я просто хочу, чтобы они оба использовали одну и ту же таблицу изображений. Я не думаю, что для этого мне понадобится соединительная таблица (если я найду способ использовать «EntityType»).... но в любом случае я решил, что для меня будет более гибким делать многие ко многим, как вы предложить .. и ваш код работал отлично. Спасибо!!
Вы поняли это? Я также добиваюсь чего-то подобного с вложениями файлов.