C# 如何知道DbEntityEntry中存储的属性是否为属性`?
在C# 如何知道DbEntityEntry中存储的属性是否为属性`?,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,在DbEntityEntry中的实体框架6中,可以通过调用属性来检索某些信息。 但是,当属性不是属性而是集合或引用时,如果出现ArgumentException,则此操作将失败。而不是必须使用其他功能 我如何知道调用哪个函数?也就是说,我如何知道该属性是什么类型(简单属性、复杂属性、引用、集合) 有关DbEntityEntry,请参阅 我正在Visual Studio 2013中使用Entity Framework 6.1.3。我找到了如何获取导航属性是否为集合类型的方法。 为此,我们需要获取属
DbEntityEntry
中的实体框架6中,可以通过调用属性来检索某些信息。
但是,当属性不是属性而是集合或引用时,如果出现ArgumentException
,则此操作将失败。而不是必须使用其他功能
我如何知道调用哪个函数?也就是说,我如何知道该属性是什么类型(简单属性、复杂属性、引用、集合)
有关DbEntityEntry,请参阅
我正在Visual Studio 2013中使用Entity Framework 6.1.3。我找到了如何获取导航属性是否为集合类型的方法。
为此,我们需要获取属性的builtypekind
我使用此代码获取实体的所有导航属性:
var entitySetElementType = ((IObjectContextAdapter)context).ObjectContext.CreateObjectSet<TEntity>().EntitySet.ElementType;
var navProperties = entitySetElementType.NavigationProperties;
更新
由于EF已移动到一个单独的程序集和命名空间,因此上述代码中的System.Data.Metadata.Edm.builtypekind.CollectionKind
应更改为System.Data.Entity.Core.Metadata.Edm.builtypekind.CollectionKind,其中一个步骤是挖掘这些动态代理。我这样做是因为:
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表达式,您可以检查所有类型。返回一个DbMemberEntry
,您可以使用(memberEntry是DbPropertyEntry)
检查该类型。您的问题解决了吗?我有完全相同的条件。我前进了一步,但还没有完全进步。我将在今天晚些时候发布(代码目前不可用)我还需要找到导航属性是否为集合类型。我把它作为答案贴了出来。请告诉我你的路。
private bool IsSimpleProperty( string propertyName, DbEntityEntry entry )
{
DbMemberEntry memberEntry = entry.Member( propertyName );
return memberEntry is DbPropertyEntry;
}