Сопоставление базы данных с кодом, таблица отсутствует (не была создана) для связи "многие ко многим"

Я создаю приложение веб-форм ASP.NET с использованием Entity Framework 6.1 с подходом, основанным на коде, для создания базы данных. У меня есть две таблицы, Product и Tags, в отношениях "многие ко многим". Классы ниже:

public class Product
{
    public long Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public virtual ICollection<Tag> Tags { get; set; }
}

public class Tag
{
    public long Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Product> Products{ get; set; }
}

Мне нужны две соединительные таблицы из этой связи ProductTags и ProductTagsTradeFor. Поэтому я переопределил OnModelCreating для WebsiteDbContext.

modelBuilder.Entity<Product>().HasMany<Tag>(s => s.Tags).WithMany(c => c.Products)
    .Map(cs =>
    {
        cs.MapLeftKey("ProductId");
        cs.MapRightKey("TagId");
        cs.ToTable("ProductTags");
    });
modelBuilder.Entity<Product>().HasMany<Tag>(s => s.Tags).WithMany(c => c.Products)
    .Map(cs =>
    {
        cs.MapLeftKey("ProductId");
        cs.MapRightKey("TagId");
        cs.ToTable("ProductTradeForTags");
    });

После запуска приложения база данных была создана, и таблица ProductTradeForTags присутствует, но таблица ProductTags отсутствует.

В чем проблема и как ее исправить, чтобы обе таблицы были созданы?


person Community    schedule 13.08.2015    source источник


Ответы (2)


Вы не можете поделиться свойствами навигации. Вам нужно будет добавить второй набор навигационных коллекций к каждому:

public class Product
{
    public long Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public virtual ICollection<Tag> Tags { get; set; }
    public virtual ICollection<Tag> TradeForTags { get; set; }
}

public class Tag
{
    public long Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Product> Products{ get; set; }
    public virtual ICollection<Product> TradeForProducts{ get; set; }
}

Затем

modelBuilder.Entity<Product>().HasMany(s => s.Tags).WithMany(c => c.Products)
    .Map(cs =>
    {
        cs.MapLeftKey("ProductId");
        cs.MapRightKey("TagId");
        cs.ToTable("ProductTags");
    });
modelBuilder.Entity<Product>().HasMany(s => s.TradeForTags).WithMany(c => c.TradeForProducts)
    .Map(cs =>
    {
        cs.MapLeftKey("ProductId");
        cs.MapRightKey("TagId");
        cs.ToTable("ProductTradeForTags");
    });
person Steve Greene    schedule 13.08.2015

Ваша модель требует перехода от тега к продуктам и от продукта к тегам.
В этом случае достаточно одной ассоциативной таблицы.
EF должен вызвать исключение, но он просто игнорирует первую конфигурацию.

person bubi    schedule 14.08.2015