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;
 }
Esempio n. 3
0
            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);
            }