如何知道存储在DbEntityEntry中的属性是否属于属性`?

时间:2015-04-10 21:14:04

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

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。

3 个答案:

答案 0 :(得分: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已经转移到一个单独的组件&amp;命名空间,上面代码中的System.Data.Metadata.Edm.BuiltInTypeKind.CollectionKind应更改为System.Data.Entity.Core.Metadata.Edm.BuiltInTypeKind.CollectionKind

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

ROWID

不是很干净,但能完成工作。

<强> 更新

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

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

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