在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。
答案 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表达式,您可以检查所有类型。