2016-11-24 2 views
1

В настоящее время я сталкиваюсь с проблемой, когда у меня есть единая сущность (Исполнитель), которая может быть либо «хедлайнером», либо «актом поддержки» для данного события в многопользовательском - много отношений.EF Отношение «многие ко многим» с такими же объектами

экстремально упрощенная версия этих таблиц:

+----------------+  +----------------+ 
| Artist   |  | Event   | 
+----------------+  +----------------+ 
| ArtistId  |  | EventId  | 
| ExternalId  |  | Name   | 
| Name   |  |    | 
+----------------+  +----------------+ 

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

+----------------+  +----------------+ 
| Headliner  |  | SupportAct  | 
+----------------+  +----------------+ 
| ArtistId  |  | ArtistId  | 
| EventId  |  | EventId  | 
+----------------+  +----------------+ 

И ввел следующий код в объекте Event

private ICollection<Headliner> _headliners; 

    public virtual ICollection<Headliner> Headliners 
    { 
     get { return _headliners ?? (_headliners = new Collection<Headliner>()); } 
     protected set { _headliners = value; } 
    } 

    private ICollection<SupportAct> _supportActs; 

    public virtual ICollection<SupportAct> SupportActs 
    { 
     get { return _supportActs ?? (_supportActs = new Collection<SupportAct>()); } 
     protected set { _supportActs = value; } 
    } 

То, что я пытаюсь выполнить более оптимизированное решение, которое будет выглядеть как вы найдете ниже.

И где код будет сведен к тому, что вы найдете ниже. Но это не допускается ....

private ICollection<Artist> _headliners; 

    public virtual ICollection<Artist> Headliners 
    { 
     get { return _headliners ?? (_headliners = new Collection<Artist>()); } 
     protected set { _headliners = value; } 
    } 

    private ICollection<Artist> _supportActs; 

    public virtual ICollection<Artist> SupportActs 
    { 
     get { return _supportActs ?? (_supportActs = new Collection<Artist>()); } 
     protected set { _supportActs = value; } 
    } 

описал нечто вроде выше представляется возможным, поскольку это дало бы мне прямой доступ к художнику сущностями?

+0

почему вы не можете достичь его, используя только 1 распределительную таблицу? – Sampath

ответ

1

Если я правильно понял, вы хотите перейти на many-to-many связь с неявной таблицей соединений. И вам нужны две такие ассоциации между одними и теми же объектами.

Ну, вы можете настроить две (или столько, сколько пожелаете) ассоциаций между одними и теми же объектами так же, как вы определяете одну ассоциацию, - используя свободную конфигурацию. Просто удалите Headliner и SupportAct объекты и использовать следующие:

modelBuilder.Entity<Event>() 
    .HasMany(e => e.Headliners) 
    .WithMany() 
    .Map(a => a.ToTable("Headliner") 
     .MapLeftKey("EventId") 
     .MapRightKey("ArtistId")); 

modelBuilder.Entity<Event>() 
    .HasMany(e => e.SupportActs) 
    .WithMany() 
    .Map(a => a.ToTable("SupportAct") 
     .MapLeftKey("EventId") 
     .MapRightKey("ArtistId")); 
Смежные вопросы