public MongoMetadata(string connectionString, MongoConfiguration.Metadata metadata = null) { this.connectionString = connectionString; this.Configuration = metadata ?? MongoConfiguration.Metadata.Default; lock (MetadataCache) { MongoMetadataCache metadataCache; MetadataCache.TryGetValue(this.connectionString, out metadataCache); if (metadataCache == null) { metadataCache = new MongoMetadataCache { DspMetadata = new DSPMetadata(ContainerName, RootNamespace), ProviderTypes = new Dictionary<string, Type>() }; MetadataCache.Add(this.connectionString, metadataCache); } this.dspMetadata = metadataCache.DspMetadata; this.providerTypes = metadataCache.ProviderTypes; } using (var context = new MongoContext(connectionString)) { PopulateMetadata(context); } }
protected override void PopulateMetadata(DSPMetadata metadata, MongoContext context) { foreach (var collectionName in GetCollectionNames(context)) { var collection = context.Database.GetCollection(collectionName); var document = collection.FindOne(); if (document != null) { var collectionType = metadata.AddEntityType(collectionName); foreach (var element in document.Elements) { var elementType = GetElementType(context, element); if (element.Name == "_id") { metadata.AddKeyProperty(collectionType, "ID", elementType); } else if (elementType == typeof(BsonDocument)) { string referencedCollectionName = GetDocumentCollection(context, element.Value.AsBsonDocument).Name; resourceReferences.Add(new Tuple<ResourceType, string, string>(collectionType, element.Name, referencedCollectionName)); } else if (elementType == typeof(BsonArray)) { var bsonArray = element.Value.AsBsonArray; if (bsonArray != null && bsonArray.Count > 0) { string referencedCollectionName = GetDocumentCollection(context, bsonArray[0].AsBsonDocument).Name; resourceSetReferences.Add(new Tuple<ResourceType, string, string>(collectionType, element.Name, referencedCollectionName)); } } else { metadata.AddPrimitiveProperty(collectionType, element.Name, elementType); } } metadata.AddResourceSet(collectionName, collectionType); } } foreach (var reference in resourceReferences) { var referencedResourceSet = metadata.ResourceSets.Where(x => x.Name == reference.Item3).SingleOrDefault(); if (referencedResourceSet != null) { metadata.AddResourceSetReferenceProperty(reference.Item1, reference.Item2, referencedResourceSet); } } foreach (var reference in resourceSetReferences) { var referencedResourceSet = metadata.ResourceSets.Where(x => x.Name == reference.Item3).SingleOrDefault(); if (referencedResourceSet != null) { metadata.AddResourceSetReferenceProperty(reference.Item1, reference.Item2, referencedResourceSet); } } }
public DSPInMemoryContext CreateContext(DSPMetadata metadata, string connectionString) { var dspContext = new DSPInMemoryContext(); using (MongoContext mongoContext = new MongoContext(connectionString)) { PopulateData(dspContext, mongoContext, metadata); } return dspContext; }
public DSPMetadata CreateMetadata() { var metadata = new DSPMetadata("MongoContext", "Northwind"); using (MongoContext context = new MongoContext(ConfigurationManager.ConnectionStrings["NorthwindContext.MongoDB"].ConnectionString)) { PopulateMetadata(metadata, context); } return metadata; }
private void PopulateData(DSPInMemoryContext dspContext, MongoContext mongoContext, DSPMetadata metadata) { foreach (var resourceSet in metadata.ResourceSets) { var storage = dspContext.GetResourceSetStorage(resourceSet.Name); var collection = mongoContext.Database.GetCollection(resourceSet.Name); foreach (var document in collection.FindAll()) { var resource = MongoDSPConverter.CreateDSPResource(document, metadata, resourceSet.Name); storage.Add(resource); } } }
protected override void PopulateMetadata(DSPMetadata metadata, MongoContext context) { var itemsType = new ResourceType(typeof(Dictionary<string, object>), ResourceTypeKind.ComplexType, null, "Northwind", "Items", false); foreach (var collectionName in GetCollectionNames(context)) { var collectionType = metadata.AddEntityType(collectionName); metadata.AddKeyProperty(collectionType, "Id", typeof(string)); metadata.AddComplexProperty(collectionType, "Items", itemsType); metadata.AddResourceSet(collectionName, collectionType); } }
public DSPContext CreateContext(DSPMetadata metadata) { if (cachedContext == null) { lock (this) { var dspContext = new DSPContext(); using (MongoContext mongoContext = new MongoContext(ConfigurationManager.ConnectionStrings["NorthwindContext.MongoDB"].ConnectionString)) { foreach (var resourceSet in metadata.ResourceSets) { var entities = dspContext.GetResourceSetEntities(resourceSet.Name); foreach (var bsonDocument in mongoContext.Database.GetCollection(resourceSet.Name).FindAll()) { var resource = CreateDSPResource(resourceSet.ResourceType, bsonDocument); entities.Add(resource); } } } foreach (var reference in resourceReferences) { resourceMap[reference.Item1].SetValue(reference.Item2, resourceMap[reference.Item3]); } foreach (var reference in resourceSetReferences) { var referencedCollection = new List<DSPResource>(); resourceMap[reference.Item1].SetValue(reference.Item2, referencedCollection); foreach (var objectId in reference.Item3) { referencedCollection.Add(resourceMap[objectId]); } } cachedContext = dspContext; } } return cachedContext; }
public object Clone() { var dspMetadata = new DSPMetadata(this.containerName, this.namespaceName); var emptyResourceTypes = this.resourceTypes.Where(x => x.Value.ResourceTypeKind == ResourceTypeKind.ComplexType && !x.Value.Properties.Any()); foreach (var resourceType in emptyResourceTypes) { AddPrimitiveProperty(resourceType.Value, "empty_content", typeof(byte[])); } foreach (var resourceType in this.resourceTypes) { dspMetadata.resourceTypes.Add(resourceType.Key, resourceType.Value.Clone()); } foreach (var resourceSet in this.resourceSets) { dspMetadata.resourceSets.Add(resourceSet.Key, resourceSet.Value.Clone(dspMetadata.resourceTypes)); } return(dspMetadata); }
public DSPQueryableContext CreateContext(DSPMetadata metadata, Dictionary<string, Type> providerTypes, string connectionString) { Func<string, IQueryable> queryProviders = x => GetQueryableCollection(connectionString, providerTypes, x); var dspContext = new DSPQueryableContext(metadata, queryProviders); return dspContext; }
protected abstract void PopulateMetadata(DSPMetadata metadata, MongoContext context);
public object Clone() { var dspMetadata = new DSPMetadata(this.containerName, this.namespaceName); this.resourceTypes.ToList().ForEach(x => dspMetadata.resourceTypes.Add(x.Key, x.Value.Clone())); this.resourceSets.ToList().ForEach(x => dspMetadata.resourceSets.Add(x.Key, x.Value.Clone(dspMetadata.resourceTypes))); return dspMetadata; }
public object Clone() { var dspMetadata = new DSPMetadata(this.containerName, this.namespaceName); var emptyResourceTypes = this.resourceTypes.Where(x => x.Value.ResourceTypeKind == ResourceTypeKind.ComplexType && !x.Value.Properties.Any()); foreach (var resourceType in emptyResourceTypes) { AddPrimitiveProperty(resourceType.Value, "empty_content", typeof(byte[])); } foreach (var resourceType in this.resourceTypes) { dspMetadata.resourceTypes.Add(resourceType.Key, resourceType.Value.Clone()); } foreach (var resourceSet in this.resourceSets) { dspMetadata.resourceSets.Add(resourceSet.Key, resourceSet.Value.Clone(dspMetadata.resourceTypes)); } return dspMetadata; }
public DSPContext CreateContext(DSPMetadata metadata) { return new DSPContext(); }
/// <summary>Constructor.</summary> /// <param name="dataContext">The data context to apply the changes to.</param> /// <param name="metadata">The metadata describing the types to work with.</param> public DSPUpdateProvider(DSPContext dataContext, DSPMetadata metadata) { this.dataContext = dataContext; this.metadata = metadata; this.pendingChanges = new List<Action>(); }
/// <summary>Constructor.</summary> /// <param name="dataContext">The data context to apply the changes to.</param> /// <param name="metadata">The metadata describing the types to work with.</param> public DSPUpdateProvider(DSPContext dataContext, DSPMetadata metadata) { _dataContext = dataContext; _metadata = metadata; _pendingChanges = new List<Action>(); }
/// <summary>Constructor.</summary> /// <param name="dataContext">The data context to apply the changes to.</param> /// <param name="metadata">The metadata describing the types to work with.</param> public DSPUpdateProvider(DSPContext dataContext, DSPMetadata metadata) { this.dataContext = dataContext; this.metadata = metadata; this.pendingChanges = new List <Action>(); }
public DSPQueryableContext(DSPMetadata metadata, Func<string, IQueryable> createQueryProvider) { this.metadata = metadata; this.createQueryProvider = createQueryProvider; }
public DSPQueryableContext(DSPMetadata metadata, Func <string, IQueryable> createQueryProvider) { this.metadata = metadata; this.createQueryProvider = createQueryProvider; }