/// <summary> /// Builds <see cref="DataObjectEdmModel" /> instance using specified assemblies. /// </summary> /// <returns>An <see cref="DataObjectEdmModel" /> instance.</returns> public DataObjectEdmModel Build() { var meta = new DataObjectEdmMetadata { KeyPropertyName = _keyProperty.Name, KeyProperty = _keyProperty }; var typeFilter = TypeFilter ?? (t => true); foreach (Assembly assembly in _searchAssemblies) { IEnumerable <Type> dataObjectTypes = assembly .GetTypes() .Where(t => t.IsSubclassOf(typeof(DataObject))) .Where(typeFilter); foreach (Type dataObjectType in dataObjectTypes) { if (!meta.Contains(dataObjectType)) { AddDataObjectWithHierarchy(meta, dataObjectType); } } } if (meta[typeof(DataObject)].KeyType == null) { var key = meta[typeof(DataObject)].OwnProperties.FirstOrDefault(p => p.Name == _keyProperty.Name); Contract.Assume(key != null); meta[typeof(DataObject)].OwnProperties.Clear(); foreach (var type in meta.Types) { if (type.BaseType == typeof(DataObject) && meta[type].KeyType == null) { meta[type].OwnProperties.Add(key); meta[type].KeyType = typeof(Guid); } } } return(new DataObjectEdmModel(meta, this)); }
public DataObjectEdmModel(DataObjectEdmMetadata metadata, IDataObjectEdmModelBuilder edmModelBuilder = null) { Contract.Requires <ArgumentNullException>(metadata != null); EdmModelBuilder = edmModelBuilder; var container = UnityFactory.GetContainer(); if (container != null) { if (container.IsRegistered <IExportService>("Export")) { ExportService = container.Resolve <IExportService>("Export"); } if (container.IsRegistered <IExportService>()) { ExportService = container.Resolve <IExportService>(); } if (container.IsRegistered <IODataExportService>("Export")) { ODataExportService = container.Resolve <IODataExportService>("Export"); } if (container.IsRegistered <IODataExportService>()) { ODataExportService = container.Resolve <IODataExportService>(); } } _metadata = metadata; BuildTypeHierarchy(); BuildEdmEntityTypes(); BuildEntitySets(); RegisterMasters(); RegisterDetails(); RegisterGeoIntersectsFunction(); RegisterGeomIntersectsFunction(); }
/// <summary> /// Adds the data object for exposing with its whole hierarchy. /// </summary> /// <param name="meta">The metadata object.</param> /// <param name="dataObjectType">The type of the data object.</param> private void AddDataObjectWithHierarchy(DataObjectEdmMetadata meta, Type dataObjectType) { // Some base class can be already added. if (meta.Contains(dataObjectType)) { return; } if (dataObjectType == typeof(DataObject)) { var dataObjectTypeSettings = meta[dataObjectType] = new DataObjectEdmTypeSettings() { KeyType = typeof(Guid), EnableCollection = true, CollectionName = EntitySetNameBuilder(dataObjectType) }; // TODO AddProperty(dataObjectTypeSettings, typeof(DataObject).GetProperty(_keyProperty.Name)); return; } Type baseType = dataObjectType.BaseType; Contract.Assume(baseType != null); AddDataObjectWithHierarchy(meta, baseType); var typeSettings = meta[dataObjectType] = new DataObjectEdmTypeSettings { EnableCollection = true, CollectionName = EntitySetNameBuilder(dataObjectType), DefaultView = DynamicView.Create(dataObjectType, null).View }; AddProperties(dataObjectType, typeSettings); if (typeSettings.KeyType != null) { meta[baseType].KeyType = null; } }