C# .net核心EF-按字符串名称或类型动态添加到数据库集

C# .net核心EF-按字符串名称或类型动态添加到数据库集,c#,.net,entity-framework,.net-core,entity-framework-core,C#,.net,Entity Framework,.net Core,Entity Framework Core,假设我有一千个类,它们都继承一个基类,每个类(不是基类)都有一个表,每个表都有相同的必需列。如何使用反射或泛型在正确的表中添加或更新行?我将在运行时知道特定实体的名称 关于获取带有反射的dbset,有一些stackoverflow帖子,但答案是IQueryable,您无法向其中添加新项。那些海报似乎对此很满意,因为我想他们只是在获取数据。我需要一个数据库集,以便我可以添加和更新。我可以获得完全限定的实体名称和类型,但是如何获得具有该名称和类型的DbSet呢?我不想写一个1000行的switch语

假设我有一千个类,它们都继承一个基类,每个类(不是基类)都有一个表,每个表都有相同的必需列。如何使用反射或泛型在正确的表中添加或更新行?我将在运行时知道特定实体的名称


关于获取带有反射的dbset,有一些stackoverflow帖子,但答案是IQueryable,您无法向其中添加新项。那些海报似乎对此很满意,因为我想他们只是在获取数据。我需要一个数据库集,以便我可以添加和更新。我可以获得完全限定的实体名称和类型,但是如何获得具有该名称和类型的DbSet呢?我不想写一个1000行的switch语句:(

您可以通过动态创建一个从DbContext继承的新类型,并使用反射Emit将dbset添加到此类型来完成


在这里尝试并发布到响应中是一个有点长的解决方案,但是这里有一个GitHub链接,指向如何实现它的工作演示-

我最终使用了魔术字符串来添加我知道将出现在基类中的所有属性。虽然不理想,但它确实添加到了正确的表中,这是最终的目标

            var entityType = Assembly.GetAssembly(typeof(BaseTypeEntity)).GetType(namespacePrefix + typeName);

            // create an instance of that type
            object instance = Activator.CreateInstance(entityType);

            // Get a property on the type that is stored in the 
            // property string
            PropertyInfo prop = entityType.GetProperty("Active");
            prop.SetValue(instance, true, null);
            // .... more properties

            _context.Add(instance);

使用反射构建查询的动态SQL怎么样?
db.Database.ExecuteSqlCommand(query)
我看到的唯一一个实体被添加到集合中的地方是Program.cs,其中是:dynDbContext.Add(new Pet(){Name=“Daisy”});但是我在编译时不知道类型,那么这个示例如何解决这个问题呢?我需要类似于dbContext.Add或dbContext.Add的东西。您不需要使用一般版本的Add。您可以使用dynDbContext.Add(myObject)。