public static ViewModelToPersistenceModelPropertyNamesMaps Generate( Type viewModelType, PersistenceModelPropertiesDescription persistenceModelDescription) { var viewModelProps = viewModelType.GetProperties().Select(PropInfo.FromPropertyInfo).ToList(); var simplePropsMap = viewModelProps.Intersect(persistenceModelDescription.SimpleProperties).ToDictionary(x => x.Name, x => x.Name); var joinedMap = GetMapForSubproperty(viewModelProps, persistenceModelDescription.JoinedModels); var componentsMap = GetMapForSubproperty(viewModelProps, persistenceModelDescription.ComponentProperties); var allProps = simplePropsMap .Union(componentsMap) .Union(joinedMap) .ToDictionary(x => x.Key, x => x.Value); var missingInPersistenceModel = viewModelProps.Where(x => allProps.All(v => v.Key != x.Name)).ToList(); if (missingInPersistenceModel.Count > 0) { var propNames = missingInPersistenceModel.Select(x => x.Name).ToArray(); var message = "Properties from view model not found in persistence model: " + string.Join(",", propNames); throw new ApplicationException(message); } return(new ViewModelToPersistenceModelPropertyNamesMaps(allProps)); }
static ViewModelsReader() { // TODO: this could be handled by IoC container not class itself. But maybe it's beter to store this information in static fields? Think about. persistenceModelDescription = PersistenceModelPropertiesDescriptionGenerator.GenerateDescription(typeof(TPersistenceModel)); viewModelToPersistenceModelMap = ViewModelToPersistenceModelPropertyNamesMapsGenerator.Generate( typeof(TGridModel), persistenceModelDescription); projectionsList = ProjectionsGenerator.GenerateProjectionsList(viewModelToPersistenceModelMap); }
public static QueryOver <TPersistenceModel, TPersistenceModel> AddAlliasesForAllSubpropertiesInViewModel <TPersistenceModel>( this QueryOver <TPersistenceModel, TPersistenceModel> query, PersistenceModelPropertiesDescription modelDescription) where TPersistenceModel : IPersistenceModel { foreach (var joinedModel in modelDescription.JoinedModels) { query.UnderlyingCriteria.CreateAlias(joinedModel.Name, joinedModel.Name, JoinType.InnerJoin); } return(query); }