【问题标题】:Get all model types获取所有模型类型
【发布时间】:2015-11-26 00:22:34
【问题描述】:

如何获取属于模型一部分的实体类型列表,以便测试模型是否真正适用于该实体类型?

var dcx = new MyDbContext();
var lst = new List<Type>();
//populate the list here somehow
//...
foreach (var t in lst) {
    var set = dcx.Set(t); //I'm trying to avoid an exception here
    try {
        var test = set.FirstOrDefault();
    } catch (Exception ex) {
        Console.WriteLine("{0} has an error", t);
    }
}

注意:即使MyDbContext 上没有对应的DbSet 属性,也完全可以查询dcx.Set(t);因此,仅通过反射迭代 MyDbContext 的属性是不够的,其返回类型的通用定义是 DbSet&lt;T&gt; 甚至是 IDbSet&lt;T&gt;

【问题讨论】:

  • 模型或 POCO 将是不同类型,不能创建不同类型的 List,只能创建相同类型的 List,本例为 List 特定 POCO 或模型类型。唯一的选择是 List n = new List();我不会推荐这个。
  • @coderealm 我不确定您是否正确。该列表是TypeList,操作员循环遍历每个Type 并从数据库上下文中获取对应的Set。我不确定您是否可以在这里避免异常,尽管如果您将 set = dcx.Set(t) 移动到 try/catch 内部(或将其放入自己的 try/catch 中),那么您至少可以吞下它。否则,您可以创建一个放在模型类上的属性,您可以通过反射查询以获取具有该属性的所有类型。
  • @coderealm 我可以创建一个包含不同字符串的List&lt;string&gt;System.Type 只是一个包含给定类型信息的类。
  • 你可能想看看这个:stackoverflow.com/a/3893502/861716

标签: c# entity-framework ef-code-first


【解决方案1】:

也许是这样的?

var types = typeof(MyDbContext)
    .GetProperties()
    .Where(prop => prop.PropertyType.IsGenericType)
    .Where(prop => prop.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>))
    .Select(prop => prop.PropertyType.GenericTypeArguments.First())
    .Distinct();

【讨论】:

  • 我知道,您可以使用反射来实现几乎任何目标。除了编写插件之外,我个人是个糟糕的选择,因为如果我开始考虑反射,我应该考虑重新设计解决方案。因为,使用反射,你实际上是在说我不知道​​我在运行时期待什么,但请在运行时为我创建类型。当您编写自己的代码库时,您在运行前就知道每种类型。
  • @coderealm 这实际上是在一个类库中,它不知道从 DbContext 继承的类的定义属性。
  • 1) 抱歉,在我的代码中我使用了 IDbSet,这就是我忘记更改它的原因。 2) 不确定 distinct 是否可以比较类型?这就是我删除它的原因。 3)这对你有帮助吗?好像你已经有点知道该怎么做了:)
  • RE: 2 -- 表示类型的 Type 对象是唯一的;也就是说,当且仅当它们表示相同的类型时,两个 Type 对象引用引用相同的对象。这允许使用引用相等来比较 Type 对象。 (System.Type)
  • RE: 3 -- 请参阅我的问题的最后一行。
【解决方案2】:

感谢@GertArnold 's comment 中的链接,我现在正在使用以下内容:

var dcx = new MyDbContext();
var objContext = ((IObjectContextAdapter)dcx).ObjectContext;
var types = objContext.MetadataWorkspace.GetItems<EntityType>(DataSpace.OSpace).Select(x => Type.GetType(x.FullName));
foreach (var t in lst) {
...

【讨论】:

  • 此解决方案不起作用。还有为什么叫 db.什么时候有dcx??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
  • 2014-09-28
  • 1970-01-01
  • 2019-07-17
  • 1970-01-01
相关资源
最近更新 更多