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