【问题标题】:How to know whether a property stored in DbEntityEntry is a property`?如何知道存储在 DbEntityEntry 中的属性是否是属性?
【发布时间】:2017-02-20 02:39:58
【问题描述】:

DbEntityEntry 内的实体框架 6 中,可以通过调用 Property 来检索某些信息。 但是,当属性不是属性而是集合或引用时,这将失败并显示ArgumentException。必须使用其他功能。

我如何知道要调用哪个函数?即如何知道属性是什么类型(简单属性、复杂属性、引用、集合)?

对于 DbEntityEntry,请参阅 https://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.dbentityentry%28v=vs.113%29.aspx

我在 Visual Studio 2013 中使用 Entity Framework 6.1.3。

【问题讨论】:

  • 您的问题解决了吗?我有完全一样的西装。
  • 我进步了一步 - 但还没有完全。我将在今天晚些时候发布(我现在无法使用代码)
  • 我还可以找到导航属性是否为集合类型。我已将其发布为答案。请告诉我你的方式。

标签: c# entity-framework entity-framework-6


【解决方案1】:

DbEntityEntry.Member(string) 返回一个DbMemberEntry,您可以使用(memberEntry is DbPropertyEntry) 进行检查。

【讨论】:

    【解决方案2】:

    我找到了如何获取导航属性是否为集合类型。 为此,我们需要获取属性的BuiltInTypeKind

    我正在使用此代码获取实体的所有导航属性:

    var entitySetElementType = ((IObjectContextAdapter)context).ObjectContext.CreateObjectSet<TEntity>().EntitySet.ElementType;
    var navProperties = entitySetElementType.NavigationProperties;
    

    然后,我们可以知道导航属性是否为集合:

    foreach (var navigationProperty in entiySetElementType.NavigationProperties)
    {
          var builtInType = navigationProperty.TypeUsage.EdmType.BuiltInTypeKind;
          var isCollection = builtInType == System.Data.Metadata.Edm.BuiltInTypeKind.CollectionKind
                          || builtInType == System.Data.Metadata.Edm.BuiltInTypeKind.CollectionType;
    }
    

    更新

    由于 EF 已移至单独的程序集和命名空间,因此上述代码中的 System.Data.Metadata.Edm.BuiltInTypeKind.CollectionKind 应更改为 System.Data.Entity.Core.Metadata.Edm.BuiltInTypeKind.CollectionKind

    【讨论】:

      【解决方案3】:

      其中一个步骤是挖掘这些动态代理。我这样做:

          if ( targetType.BaseType != null
              && targetType.Namespace == "System.Data.Entity.DynamicProxies" )
          {
              targetType = targetType.BaseType;
          }
      

      不是很干净,但可以。

      更新

      根据jjj的回答,我想出了以下方法:

              private bool IsSimpleProperty( string propertyName, DbEntityEntry entry )
              {
                  DbMemberEntry memberEntry = entry.Member( propertyName );
      
                  return memberEntry is DbPropertyEntry;
              }
      

      通过改变 is 表达式,您可以检查所有类型。

      【讨论】:

        猜你喜欢
        • 2017-08-26
        • 2016-04-18
        • 1970-01-01
        • 2022-07-01
        • 2010-11-03
        • 1970-01-01
        • 1970-01-01
        • 2016-01-31
        • 2015-09-30
        相关资源
        最近更新 更多