internal EntityTypeInfo(IEdmModel edmModel, IEdmEntityType edmEntityType, ITypeResolver typeResolver) { Contract.Assert(edmModel != null); Contract.Assert(edmEntityType != null); Contract.Assert(typeResolver != null); _edmEntityType = edmEntityType; string edmTypeName = edmEntityType.FullName(); _type = typeResolver.ResolveTypeFromName(edmTypeName); // Initialize DontSerializeProperties _dontSerializeProperties = _type.GetProperties().Where(p => p.GetCustomAttributes(typeof(IgnoreDataMemberAttribute), true).Length > 0).Select(p => p.Name).ToArray(); //edmEntityType.DeclaredKey; //edmEntityType.BaseEntityType(); var structuralProperties = new List<PropertyInfo>(); foreach (var edmStructuralProperty in edmEntityType.StructuralProperties()) { if (! _dontSerializeProperties.Contains(edmStructuralProperty.Name)) { structuralProperties.Add(_type.GetProperty(edmStructuralProperty.Name)); } } // EF can pick up private properties (eg: those marked as navigational). We omit them on spec. _structuralProperties = structuralProperties.Where(p => p != null).ToArray(); var navigationProperties = new List<PropertyInfo>(); var linkProperties = new List<PropertyInfo>(); foreach (var edmNavigationProperty in edmEntityType.NavigationProperties()) { if (! _dontSerializeProperties.Contains(edmNavigationProperty.Name)) { if (edmNavigationProperty.Type.IsCollection()) { linkProperties.Add(_type.GetProperty(edmNavigationProperty.Name)); } else { navigationProperties.Add(_type.GetProperty(edmNavigationProperty.Name)); } } } _navigationProperties = navigationProperties.Where(p => p != null).ToArray(); _collectionProperties = linkProperties.Where(p => p != null).ToArray(); // Reflect for ValidationAttributes on all properties var validationInfo = new List<PropertyValidationInfo>(); InitValidationInfo(validationInfo, _structuralProperties, PropertyCategory.Structural); InitValidationInfo(validationInfo, _navigationProperties, PropertyCategory.Navigation); InitValidationInfo(validationInfo, _collectionProperties, PropertyCategory.Collection); _propertyValidationInfo = validationInfo.ToArray(); }