Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何添加DbSet<;EntityName>;到使用Codedom动态生成的上下文?_C#_Entity Framework_Codedom - Fatal编程技术网

C# 如何添加DbSet<;EntityName>;到使用Codedom动态生成的上下文?

C# 如何添加DbSet<;EntityName>;到使用Codedom动态生成的上下文?,c#,entity-framework,codedom,C#,Entity Framework,Codedom,我使用Codedom动态生成实体。我也没有硬编码的上下文类作为解决方案的一部分。也就是说,我还在运行时使用Codedom生成上下文。我这样做是因为每个生成的实体都有自己的上下文。我在为上下文类编写Codedom代码时遇到了问题。作为上下文的一部分,我需要写入DbSet属性,以便生成的实体可以成为上下文模型的一部分。更具体地说,我需要在生成的上下文中使用以下行: public DbSet<EntityName> EntityNames { get; set; } 我将生成的上下文的名

我使用Codedom动态生成实体。我也没有硬编码的上下文类作为解决方案的一部分。也就是说,我还在运行时使用Codedom生成上下文。我这样做是因为每个生成的实体都有自己的上下文。我在为上下文类编写Codedom代码时遇到了问题。作为上下文的一部分,我需要写入DbSet属性,以便生成的实体可以成为上下文模型的一部分。更具体地说,我需要在生成的上下文中使用以下行:

public DbSet<EntityName> EntityNames { get; set; }
我将生成的上下文的名称设置为相应的实体名称+上下文,因此在该行中,我将删除“上下文”以获取entityName。不管怎么说,这并不重要。给我带来麻烦的线路是第一类:

prop.Type = new CodeTypeReference(typeof(DbSet<>));
这个方法的一个参数,但它不是这样的


有人知道怎么解决这个问题吗?我原以为编写这样的代码会简单得多,但Codedom有时并不像我想象的那样合作…

如果我们深入到问题的核心,你基本上想要的是如何使用反射来获得封闭泛型类型的类型。这与CodeDom或EntityFramework没有任何关系

正如您所提到的,使用
typeof(DbSet)
(或
List
,或任何东西)将为您提供“开放泛型类型”,即特定泛型类型所基于的类型。从这里,您可以使用该方法创建特定的封闭泛型类型:

var openType = typeof(DbSet<>);
var closedType = openType.MakeGenericType(entityType);
var openType=typeof(DbSet);
var closedType=openType.MakeGenericType(entityType);

您需要打开generic
DbSet
并将其关闭,如下所示:

typeof(DbSet<>).MakeGenericType(entityType)
typeof(DbSet).MakeGenericType(entityType)

为什么要生成上下文?看一看。还有一些:为什么每个实体只有一个上下文?你想得到什么?你的目标是什么?谢谢你的解释!我现在清楚了问题的实质。有时很难将森林与树木分开,特别是在使用复杂的库(如CodeDom或EF)时谢谢你的帮助:)我接受了另一个,因为他是第一个哈哈
prop.Type = new CodeTypeReference(typeof(DbSet<>));
DbSet<>
DbSet<EntityName>
prob.Type = new CodeTypeReference(typeof(DbSet<entityType>));
Type entityType
var openType = typeof(DbSet<>);
var closedType = openType.MakeGenericType(entityType);
typeof(DbSet<>).MakeGenericType(entityType)