private void CheckType(EntityType ospaceEntityType) { _scalarMembers = new HashSet <EdmMember>(); _relationshipMembers = new HashSet <EdmMember>(); foreach (var member in ospaceEntityType.Members) { var clrProperty = ospaceEntityType.ClrType.GetTopProperty(member.Name); if (clrProperty != null && EntityProxyFactory.CanProxySetter(clrProperty)) { if (member.BuiltInTypeKind == BuiltInTypeKind.EdmProperty) { if (_implementIEntityWithChangeTracker) { _scalarMembers.Add(member); } } else if (member.BuiltInTypeKind == BuiltInTypeKind.NavigationProperty) { if (_implementIEntityWithRelationships) { var navProperty = (NavigationProperty)member; var multiplicity = navProperty.ToEndMember.RelationshipMultiplicity; if (multiplicity == RelationshipMultiplicity.Many) { if (clrProperty.PropertyType.IsGenericType() && clrProperty.PropertyType.GetGenericTypeDefinition() == typeof(ICollection <>)) { _relationshipMembers.Add(member); } } else { _relationshipMembers.Add(member); } } } } } if (ospaceEntityType.Members.Count != _scalarMembers.Count + _relationshipMembers.Count) { _scalarMembers.Clear(); _relationshipMembers.Clear(); _implementIEntityWithChangeTracker = false; _implementIEntityWithRelationships = false; } }
private void CheckType(EntityType ospaceEntityType) { this._scalarMembers = new HashSet <EdmMember>(); this._relationshipMembers = new HashSet <EdmMember>(); foreach (EdmMember member in ospaceEntityType.Members) { PropertyInfo topProperty = ospaceEntityType.ClrType.GetTopProperty(member.Name); if (topProperty != (PropertyInfo)null && EntityProxyFactory.CanProxySetter(topProperty)) { if (member.BuiltInTypeKind == BuiltInTypeKind.EdmProperty) { if (this._implementIEntityWithChangeTracker) { this._scalarMembers.Add(member); } } else if (member.BuiltInTypeKind == BuiltInTypeKind.NavigationProperty && this._implementIEntityWithRelationships) { if (((NavigationProperty)member).ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many) { if (topProperty.PropertyType.IsGenericType() && topProperty.PropertyType.GetGenericTypeDefinition() == typeof(ICollection <>)) { this._relationshipMembers.Add(member); } } else { this._relationshipMembers.Add(member); } } } } if (ospaceEntityType.Members.Count == this._scalarMembers.Count + this._relationshipMembers.Count) { return; } this._scalarMembers.Clear(); this._relationshipMembers.Clear(); this._implementIEntityWithChangeTracker = false; this._implementIEntityWithRelationships = false; }
private static void EmitBaseSetter( TypeBuilder typeBuilder, PropertyBuilder propertyBuilder, PropertyInfo baseProperty) { if (!EntityProxyFactory.CanProxySetter(baseProperty)) { return; } MethodInfo meth = baseProperty.Setter(); MethodAttributes methodAttributes = meth.Attributes & MethodAttributes.MemberAccessMask; MethodBuilder mdBuilder = typeBuilder.DefineMethod("set_" + baseProperty.Name, methodAttributes | MethodAttributes.Virtual | MethodAttributes.HideBySig | MethodAttributes.SpecialName, (Type)null, new Type[1] { baseProperty.PropertyType }); ILGenerator ilGenerator = mdBuilder.GetILGenerator(); ilGenerator.Emit(OpCodes.Ldarg_0); ilGenerator.Emit(OpCodes.Ldarg_1); ilGenerator.Emit(OpCodes.Call, meth); ilGenerator.Emit(OpCodes.Ret); propertyBuilder.SetSetMethod(mdBuilder); }