Как настроить отношения «многие ко многим», используя свободно распространяемый API - PullRequest
25 голосов
/ 19 января 2012

Сначала я пытаюсь установить отношение «многие ко многим» в коде 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 создадут таблицы БД в виде:

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

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

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

AccountProducts Table
---------------------
Account_Id
Product_Id

Ответы [ 4 ]

59 голосов
/ 19 января 2012
modelBuilder.Entity<Account>()
            .HasMany(a => a.Products)
            .WithMany()
            .Map(x =>
            {
                x.MapLeftKey("Account_Id");
                x.MapRightKey("Product_Id");
                x.ToTable("AccountProducts");
            });
7 голосов
/ 19 января 2012

То, что предложил 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; }
}
2 голосов
/ 19 января 2012

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

Одна учетная запись может иметь несколько продуктов.

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

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; }
}

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

1 голос
/ 19 января 2012
        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"));
    }
...