Подтвердить что ты не робот

Как настроить отношение многих ко многим, используя API-интерфейс сущностей

Сначала я пытаюсь установить отношение многих ко многим в EF-коде, но соглашения по умолчанию ошибочны. Следующие классы описывают взаимосвязь:

class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
}

class Account
{        
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Product> Products { get; set; }
}

У одной учетной записи может быть много продуктов.

Однако соглашения EF будут создавать таблицы DB как:

Products Table
--------------
Id
Name
Account_Id  <- What is this?

Accounts Table
--------------
Id
Name

Это не похоже на структуру таблицы "многие-ко-многим"? Как я могу настроить свободный API для отражения отношений и создания промежуточной таблицы:

AccountProducts Table
---------------------
Account_Id
Product_Id
4b9b3361

Ответ 1

modelBuilder.Entity<Account>()
            .HasMany(a => a.Products)
            .WithMany()
            .Map(x =>
            {
                x.MapLeftKey("Account_Id");
                x.MapRightKey("Product_Id");
                x.ToTable("AccountProducts");
            });

Ответ 2

Что предложил EF, это отношение "один ко многим".

У одной учетной записи может быть множество Продуктов, то есть каждый Продукт имеет Account_Id

Если вам нужно отношение много-много (и создать промежуточную таблицу), то следует работать

class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Account> Accounts { get; set; }
}

class Account
{        
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Product> Products { get; set; }
}

Ответ 3

Сначала код создает таблицы в правильном реляционном режиме. Когда

У одной учетной записи может быть много продуктов.

Таблица продуктов должна хранить ключ для своей учетной записи, как это сейчас происходит.

То, что вы пытаетесь увидеть в db, - это отношения "многие ко многим", а не одно. Если вы хотите добиться этого с помощью кода сначала, вы должны перепроектировать свои объекты

class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Account> Accounts { get; set; }
}

class Account
{        
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Product> Products { get; set; }
}

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

Ответ 4

        public AccountProductsMap()
    {
        this.ToTable("AccountProducts");
        this.HasKey(cr => cr.Id);

        this.HasMany(cr => cr.Account)
            .WithMany(c => c.Products)
            .Map(m => m.ToTable("AccountProducts_Mapping"));
    }