EF 支持泛型动态加载类访问数据库

  public class Mode1 : IDataItem
    {
        public string  Name
        {
            get;
            set;
        }
        public int  Id
        {
            get; set;
        }
    }
    public class Mode2 : IDataItem
    {

       
        public int Age
        {
            get;
            set;
        }
        public int Id
        {
            get; set;
        }
    }

    public class  MyContext:DbContext
    {

        public MyContext():base("name=mydb")
        {
            //System.Data.Entity.Database.SetInitializer(new Models.CreateData());
        }
        //public DbSet<Mode1> Mode1s { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {

            Type[] ts = new Type[] { typeof(Mode1), typeof(Mode2) };
            foreach (var item in ts)
            {
                Type mappingType = typeof(StdMapping<>).MakeGenericType(item);
                object obj = Activator.CreateInstance(mappingType);
               Type cfgType = modelBuilder.Configurations.GetType();
               // var method = cfgType.GetMethod("Add",  new Type[] { typeof(EntityTypeConfiguration<>) }); AddFromAssembly
               var methods= cfgType.GetMethods(BindingFlags.Instance | BindingFlags.Public);
               var method = methods.First(t => t.Name == "Add" && t.GetGenericArguments()[0].Name == "TEntityType");
               method.MakeGenericMethod(item).Invoke(modelBuilder.Configurations, new object[] { obj });
            }

            var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<MyContext>(modelBuilder);
            Database.SetInitializer(sqliteConnectionInitializer);
        }
    }

    internal partial class StdMapping<T> : EntityTypeConfiguration<T> where T : class, IDataItem
    {
        public StdMapping()
        {
            this.HasKey(t => t.Id);
            //this.ToTable("tbCases");
        }
    }

    public class Myclass
    {
        public void Add<T>(List<T> cols)
        {

        }

        public void Add<T>(System.Collections.ObjectModel.Collection<T> cols)
        {

        }
    }

   

    public interface IDataItem
    {
        int Id { get; set; }
    }


    class Program
    {
        static void Main(string[] args)
        {
            int a = 5;
            int b = 2;
            int c = 3;
            int d = 4;


            using (var context = new MyContext())
            {
               // context.Database.CreateIfNotExists();
                context.Set<Mode2>().Add( new Mode2() { Id=2, Age=24});
                context.SaveChanges();
                Console.WriteLine();
            }
           


            Console.WriteLine("sss");
                Console.ReadKey();
          //  Assembly.

        }
    }
原文地址:https://www.cnblogs.com/bkyrslf/p/12667383.html