public void Generate()
        {
            if (!Directory.Exists(_cachePath))
            {
                Directory.CreateDirectory(_cachePath);
            }

            // try to resolve the real repository in the DI container
            IContainerRegistration registration;

            lock (DIContainer.Root)
                registration = DIContainer
                               .Root
                               .GetRegistrationsSnapshot()
                               .FirstOrDefault(kv => kv.Value.MappedToType == typeof(T) &&
                                               kv.Value.LifetimeManager.LifetimeType == typeof(TransientLifetimeManager))
                               .Value
                ;

            T repository;

            if (registration != null)
            {
                repository = (T)DIContainer.Root.Resolve(registration.RegisteredType, registration.Name);
            }
            else
            {
                repository = new T();   // couldn't find it so create one with the default
            }
            using (repository as IDisposable)
            {
                var mappingCollection = (StorageMappingItemCollection)repository.ObjectContext.MetadataWorkspace.GetItemCollection(DataSpace.CSSpace);
                var mappingHashValue  = mappingCollection.ComputeMappingHashValue();

                if (mappingHashValue == _serializableViews?.HashValue)
                {
                    return;
                }

                // generate the views
                var errors = new List <EdmSchemaError>();
                var views  = mappingCollection.GenerateViews(errors);

                if (errors.Any())
                {
                    throw new EdmSchemaException(errors);
                }

                // serialize them
                _serializableViews = new SerializableViews(mappingHashValue, views);

                using (Stream stream = File.Open(_cacheFilePath, FileMode.Create))
                    new BinaryFormatter().Serialize(stream, _serializableViews);
            }
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="EFRepositoryMappingViewCache{T}"/> class.
        /// </summary>
        public EFRepositoryMappingViewCache()
        {
            _cachePath = Path.Combine(
                Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData),
                nameof(EFRepository),
                typeof(T).Namespace);

            _cacheFilePath = Path.Combine(
                _cachePath,
                typeof(T).Name + CacheFileSuffix);

            // Load from an existing file
            if (File.Exists(_cacheFilePath))
            {
                using (Stream stream = File.Open(_cacheFilePath, FileMode.Open))
                    _serializableViews = (SerializableViews) new BinaryFormatter().Deserialize(stream);
            }

            if (_serializableViews == null)
            {
                Generate();
            }
        }