//-----------------------------------------------------------------------------------------------------------------------------------------------------
        protected override void OnImplementPrimaryInterface(ImplementationClassWriter<TypeTemplate.TInterface> writer)
        {
            _threadLogAppenderField = writer.Field<IThreadLogAppender>("_threadLogAppender");

            writer.Constructor<IThreadLogAppender>((w, appender) => _threadLogAppenderField.Assign(appender));

            writer.AllMethods().Implement(ImplementLogMethod);

            writer.AllProperties().Implement(
                p => p.Get(w => w.Throw<NotSupportedException>("Events are not supported")),
                p => p.Set((w, value) => w.Throw<NotSupportedException>("Events are not supported")));

            writer.AllEvents().Implement(
                e => e.Add((w, args) => w.Throw<NotSupportedException>("Events are not supported")),
                e => e.Remove((w, args) => w.Throw<NotSupportedException>("Events are not supported")));
        }
            //-----------------------------------------------------------------------------------------------------------------------------------------------------
            private void WriteEntityProperty(
                ImplementationClassWriter<TypeTemplate.TBase> writer, 
                IEdmModel model,
                IEdmProperty property, 
                List<Action<ConstructorWriter>> initializers)
            {
                var propertyClrType = TranslateEdmTypeToClrType(model, property.Type.Definition);

                using (TT.CreateScope<TT.TProperty>(propertyClrType))
                {
                    var backingField = writer.Field<TT.TProperty>("_" + property.Name);

                    if (property.Type.IsCollection())
                    {
                        Type elementClrType = propertyClrType.GetGenericArguments()[0];

                        initializers.Add(cw => {
                            using (TT.CreateScope<TT.TProperty, TT.TItem>(propertyClrType, elementClrType))
                            {
                                backingField.Assign(cw.New<TT.TProperty>(cw.Const<IEnumerable<TT.TItem>>(null), cw.Const(TrackingMode.None)));
                            }
                        });
                    }

                    writer.NewVirtualWritableProperty<TT.TProperty>(property.Name).ImplementAutomatic(backingField);
                }
            }