Организация-структура основных таблиц развязки
Я пытаюсь создать динамический объект соединения 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 жалуется, что это интерфейс, а не ссылочный тип.