Member 11380736 Ответов: 1

Организация-структура основных таблиц развязки


Я пытаюсь создать динамический объект соединения MySQL "EntityFramework Core", который отвечает за таблицы соединений соединений.
Это мой интерфейс для указания таблицы соединений:
public interface IJunctionTable<T1,T2>
  {
    int ID { get; set; }
    int CompositeKeyA { get; set; }
    int CompositeKeyB { get; set; }

    T1 DataModelRelationA { get; set; }
    T2 DataModelRelationB { get; set; }
  }

Это мой интерфейс для указания того, что таблица имеет отношение к таблице соединений:
public interface IJunctionRelationModel<TJunctionTable> where TJunctionTable : class, new()
 {
   ICollection<TJunctionTable> NavigationCollection { get; set; }
 }

Вот код, который я хочу изменить, чтобы он мог соответствовать всем таблицам соединений. Этот код работает, но жестко закодирован для использования таблиц "MediaDataModel" и "PerformerDataModel". Возможно ли изменить эту архитектуру на что-то динамическое ?
public class MySQLJunctionConnection<T> : DbContext where T : class, IJunctionTable<MediaDataModel, PerformerDataModel>
  {
    public DbSet<T> DataModel { get; private set; }
    public DbContextOptionsBuilder Connection { get; private set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
      this.Connection = optionsBuilder;
      this.Connection.UseMySql(@"server=mysqlexample.com;database=mydatabase;uid=user1;password=mypassword;");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
      // Create a composite key (Treats combined properties of junction table as one primary key)
      modelBuilder.Entity<T>().HasKey(pk => new { pk.CompositeKeyA, pk.CompositeKeyB });
      //modelBuilder.Entity<T>().HasKey(pk => new { pk.CompositeKeyA, pk.CompositeKeyB });

      // Configure MediaDataModel's side ("one-to-many" relationship) of current "many-to-many" relationship
      modelBuilder.Entity<T>().HasOne(a => a.DataModelRelationA).WithMany(a => (IEnumerable<T>)a.NavigationCollection).OnDelete(DeleteBehavior.Cascade).HasForeignKey(m => m.CompositeKeyA);

      // Configure PerformerDataModel's side ("one-to-many" relationship) of current "many-to-many" relationship
      modelBuilder.Entity<T>().HasOne(mp => mp.DataModelRelationB).WithMany(p => (IEnumerable<T>)p.NavigationCollection).OnDelete(DeleteBehavior.Cascade).HasForeignKey(p => p.CompositeKeyB);
    }
  }


Что я уже пробовал:

Я перепробовал много разных вещей.
Я попытался сделать таблицы универсальными T1 и T2, но затем modelBuilder жалуется, что это интерфейс, а не ссылочный тип.

1 Ответов

Рейтинг:
2

Gerry Schmitz

Если вы не можете понять, как смоделировать что-то в SQL, не ожидайте, что EF сможет это сделать. В какой-то момент EF лучше справляется с "базой данных в первую очередь", чем с "кодом в первую очередь".

Создайте несколько (тестовых) отношений в SQL, которые работают, посмотрите, что EF делает с ними, а затем создайте общий код на основе шаблона.


Member 11380736

Он идеально работает, когда общий тип сущности жестко закодирован, как здесь "MediaPerformerJunctionDataModel". Но я бы хотел,чтобы он был динамичным <t> или <t1, t2>

для построения модели.Сущность<mediaperformerjunctiondatamodel и GT;().HasKey(ПК =&ГТ; новое { ПК.CompositeKeyA, ПК.CompositeKeyB });
для построения модели.Сущность<mediaperformerjunctiondatamodel и GT;().Прочая, не закрывающая лодыжку(а => у собой.DataModelRelationA).WithMany(a => a.NavigationCollection).OnDelete(DeleteBehavior.Каскад).HasForeignKey(м =&ГТ; м. CompositeKeyA);
для построения модели.Сущность<mediaperformerjunctiondatamodel и GT;().Прочая, не закрывающая лодыжку(Мп =&ГТ; Мп.DataModelRelationB).WithMany(p => p.NavigationCollection).OnDelete(DeleteBehavior.Каскад).HasForeignKey(p => p.CompositeKeyB);