public StoreSchema ReadSchema(IStoreSchemaReaderParameters parameters)
        {
            var dr = parameters as EntityFrameworkStoreSchemaReaderParameters;

            if (dr == null)
            {
                throw new Exception($"EntityFrameworkStoreSchemaReader expects EntityFrameworkStoreSchemaReaderParameters.");
            }

            var schema = new StoreSchema {
                Definitions = new Dictionary <string, StoreDefinition>(), DbContextName = dr.DbContextType.FullName
            };

            using (var db = GetDbContext(dr.DbContextType))
            {
                var entities = db.Model.GetEntityTypes();

                foreach (var entityMetadata in entities)
                {
                    var def = new StoreDefinition {
                        Properties = new Dictionary <string, StoreProperty>()
                    };
                    def.Name = entityMetadata.ClrType.Name;
                    schema.Definitions.Add(def.Name, def);
                    var props = entityMetadata.GetProperties().ToList();

                    for (int i = 0; i < props.Count; i++)
                    {
                        var prop = props[i];

                        var storeProp = new StoreProperty
                        {
                            Name          = prop.Name,
                            Order         = i,
                            Type          = GetTypeString(prop.ClrType),
                            Pk            = prop.IsPrimaryKey(),
                            Fk            = prop.IsForeignKey(),
                            MaxLength     = prop.GetMaxLength(),
                            AutoIncrement = prop.ValueGenerated == ValueGenerated.OnAdd
                        };

                        if (prop.IsForeignKey())
                        {
                            var fks = prop.GetContainingForeignKeys();
                            storeProp.ForeignKeys = prop.GetContainingForeignKeys().Select(f => new StoreForeignKey
                            {
                                DefinitionName         = f.PrincipalEntityType.ClrType.Name,
                                PropertyName           = f.PrincipalKey.Properties.First().Name,
                                CompositePropertyNames = f.PrincipalKey.Properties.Select(p => p.Name).ToList()
                            }).ToList();
                        }

                        def.Properties.Add(storeProp.Name, storeProp);
                    }
                }
            }

            return(schema);
        }
 public void Configure(IQueryControllerConfiguration config)
 {
     _reader           = config.Reader;
     _storage          = config.Storage;
     _readerParameters = config.ReaderParameters;
     _resolver         = config.Resolver;
     _expressions      = config.ExpressionEngine;
 }
        public StoreSchema ReadSchema(IStoreSchemaReaderParameters parameters)
        {
            var fn       = (parameters as JsonStoreSchemaReaderParameters).SchemaFile;
            var path     = Path.GetDirectoryName(fn);
            var fileName = Path.GetFileName(fn);
            var schema   = _schemaStorage.LoadSchema(new StorageParameters {
                FileName = fileName, Path = path
            });

            return(schema);
        }