Ссылаться на одну и ту же сущность двумя разными сущностями Ef Core - PullRequest
0 голосов
/ 24 сентября 2019

Я немного запутался по этому поводу, я реализую Список желаний, в котором несколько пользователей могут добавлять одну и ту же сущность (Продукт) в свой список.Я расширил класс пользовательских учетных записей и добавил ICollection<Product>, но я не могу понять, как несколько пользователей могут ссылаться на один и тот же продукт с точки зрения внешних ключей, потому что, когда пользователь добавляет продукт в свой список пожеланий, он удаляется из предыдущегоПользователь в качестве внешнего ключа теперь ссылается на нового пользователя.очевидно, моя логика ошибочна, и я неправильно понял, как должны быть определены отношения. Не могли бы вы указать мне правильное направление?

здесь находится объект Product

    public class Product
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [Key]
        public int ProductId { get; set; }
        public string ProductName { get; set; }
        public virtual ProductType ProductType { get; set; }

        [ForeignKey("Category")]
        public int SubcategoryFK { get; set; }
        public virtual SubCategory Category { get; set; }
        public decimal Price { get; set; }
        public int NumberOfItems { get; set; }
        public string ImageUrl { get; set; }
        public string IsInStock { get; set; }
        public string ShortDescription { get; set; }
        public string LongDescription { get; set; }

        [ForeignKey("SalesUser")]
        public string SalesUserFK { get; set; }
        public virtual ApplicationUser SalesUser { get; set; }

, и отношения настроены следующим образомэто

 modelBuilder.Entity<ApplicationUser>()
 .HasMany(a => a.Products)
 .WithOne(p => p.SalesUser).HasForeignKey(z => z.SalesUserFK).OnDelete(DeleteBehavior.ClientSetNull);

1 Ответ

1 голос
/ 24 сентября 2019

Как прокомментировал Кей, отношения Product и User "многие ко многим".В EF Core отношения многие-ко-многим без класса сущности для представления таблицы соединения еще не поддерживаются.Однако вы можете представить отношение «многие ко многим», включив класс сущностей для таблицы соединений и сопоставив два отдельных отношения «один ко многим».

public class Product
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key]
    public int ProductId { get; set; }
    public string ProductName { get; set; }
    public virtual ProductType ProductType { get; set; }

    [ForeignKey("Category")]
    public int SubcategoryFK { get; set; }
    public virtual SubCategory Category { get; set; }
    public decimal Price { get; set; }
    public int NumberOfItems { get; set; }
    public string ImageUrl { get; set; }
    public string IsInStock { get; set; }
    public string ShortDescription { get; set; }
    public string LongDescription { get; set; }

    public List<UserProduct> UserProducts { get; set; }
}

public class ApplicationUser:IdentityUser
{
    public List<UserProduct> UserProducts { get; set; }
}

public class UserProduct
{
    public int ProductId { get; set; }
    public Product Product { get; set; }

    public Guid ApplicationUserId { get; set; }

    public ApplicationUser ApplicationUser { get; set; }
}

DbContext:

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<UserProduct>()
            .HasKey(up => new { up.ProductId, up.ApplicationUserId });

        modelBuilder.Entity<UserProduct>()
            .HasOne(up => up.Product)
            .WithMany(p => p.UserProducts)
            .HasForeignKey(up => up.ProductId);

        modelBuilder.Entity<UserProduct>()
            .HasOne(up => up.ApplicationUser)
            .WithMany(au => au.UserProducts)
            .HasForeignKey(up => up.ApplicationUserId);
    }

Ссылка: Соотношение «многие ко многим» и Каскадное удаление

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