Конфигурирование Entity Framework Много-много-много отношений между двумя таблицами? - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь определить отношение многих ко многим между двумя таблицами, используя сначала код для существующих таблиц.Таблица и класс «Состояние» не могут быть изменены, поэтому я пытаюсь найти способ заставить эти отношения работать в Entity Framework без изменения таблицы или класса.

У меня есть таблица в SQL, которая представленакласс:

 [Table("MySchema.Content")]
public class Content 
{ 
    public int Id { get; set; }
    public string Name { get; set; }
    public string Text { get; set; }
    public virtual ICollection<State> States { get; set; }
}

У меня есть вторая таблица, представляющая список состояний.(Этот класс и таблица не могут быть изменены). Класс:

[Table("dbo.State")]
public class State
{
    public int StateID { get; set; }
    public string Name { get; set; }
    public string ShortName { get; set; }
}

Я вручную создал объединительную таблицу с именем MySchema.Content_State, которая содержит ContentID и StateID в качестве двух столбцов.

В моем классе контекста данных я хотел бы использовать ModelBuilder для создания отношения, но не смог выяснить, как заставить его работать.

В контексте я попробовал кое-чтокак это:

 modelBuilder.Entity<Content>()
           .HasMany<State>(a => a.States)
           .WithMany(a => a.Contents)
           .Map(a =>
           {
               a.ToTable("Content_State", "MySchema");
               a.MapLeftKey("ContentId");
               a.MapRightKey("StateID");
           });

Выше не будет компилироваться, жалуясь на строку WithMany.

Как я могу настроить это для работы с моей созданной таблицей соединений?

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

В контексте я просто изменил код на:

modelBuilder.Entity<Content>()
       .HasMany<State>(a => a.States)
       .WithMany()
       .Map(a =>
       {
           a.ToTable("Content_State", "MySchema");
           a.MapLeftKey("ContentId");
           a.MapRightKey("StateID");
       });
0 голосов
/ 11 октября 2018

ваши модели

  [Table("MySchema.Content")]
public class Content
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Text { get; set; }
    public ICollection<ContentState> ContentStates { get; set; }

}

[Table("dbo.State")]
public class State
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string ShortName { get; set; }
    public ICollection<ContentState> ContentStates { get; set; }

}

public class ContentState
{
    public int ContentId { get; set; }
    public int StateId { get; set; }
    public Content Content { get; set; }
    public State State { get; set; }
}

ваше отображение

      protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                 modelBuilder.Entity<ContentState>()
            .HasKey(bc => new { bc.StateId, bc.ContentId });


        modelBuilder.Entity<ContentState>()
            .HasOne(bc => bc.Content)
            .WithMany(b => b.ContentStates)
            .HasForeignKey(bc => bc.ContentId);


        modelBuilder.Entity<ContentState>()
            .HasOne(bc => bc.State)
            .WithMany(c => c.ContentStates)
            .HasForeignKey(bc => bc.StateId);
            }
...