Esempio n. 1
0
        /// <summary>
        /// Carico gli using dall'oggetto base
        /// Aggiungo lo using dell'oggetto base. Mi serve per ereditare dall'oggetto base.
        /// Aggiungo le property dell'oggetto base
        /// Creo la nuova classe. devo ereditare dalla classe astratta base.
        /// Aggiungo la data annotation con il nome della tabella.
        /// Aggiungo le property appena create alla classe.
        /// Aggiungo la data annotatio della foreign key se necessario.
        /// Aggiungo le proprietà dinamiche dell'oggetto base se necessario.
        /// Aggiungo la classe al namespace
        /// Aggiungo il namespace alla CompilationUnit
        /// </summary>
        /// <returns></returns>
        private async Task PreparareUDSObject(bool addForeignKeyToBaseEntity, List <Metadata> metadatas)
        {
            _log.WriteInfo(new LogMessage(string.Concat("Creazione classe ", _udsClassName)), LogCategories);
            _uds.Usings = _base.Usings;
            _uds.Usings.Add(await _base.Usings.FirstOrDefault().CreateUsingAsync("VecompSoftware.DocSuiteWeb.UDS.Entities", "Base"));

            _uds.ClassSyntax = _uds.ClassSyntax
                               .CreatePublicClass(_udsClassName)
                               .AddInheritanceClass(_baseClassName)
                               .AddDataAnnotation("Table", string.Concat("\"", _udsTableAnnotation, "\""), "Schema", _dbSchema);

            if (addForeignKeyToBaseEntity)
            {
                _log.WriteInfo(new LogMessage(string.Concat("Aggiunta foreign key in ", _udsClassName)), LogCategories);
                PropertyDeclarationSyntax p = null;
                p = p.CreateProperty(_baseEntityName, _baseEntityName);
                p = AddDataAnnotationAsync(p, "ForeignKey", UDSId).Result;
                _uds.Properties.Add(p);
                _uds.ClassSyntax = _uds.ClassSyntax.AddMember(p);
            }
            else
            {
                // aggiungo l'inizializzazione delle collezioni.
                ICollection <KeyValuePair <string, string> > relation = _roslynMappings.Select(s => new KeyValuePair <string, string>(s.Value.PropertyFieldName, string.Concat(_udsClassName, "_", s.Value.ClassName))).ToList();
                _uds.ClassSyntax = await _uds.ClassSyntax.AddBaseEntityConstructorAsync(_udsClassName, relation);
            }

            if (metadatas != null)
            {
                PropertyDeclarationSyntax pMeta = null;
                foreach (Metadata m in metadatas)
                {
                    _log.WriteInfo(new LogMessage(string.Format("Aggiunta metadata {0} in {1}", m.PropertyName, _udsClassName)), LogCategories);

                    pMeta = m.Nullable ? pMeta.CreateNullableProperty(m.PropertyType, m.PropertyName) : pMeta.CreateProperty(m.PropertyType, m.PropertyName);
                    if (m.Required)
                    {
                        _log.WriteInfo(new LogMessage(string.Format("Aggiunta notation require in {0} per la classe {1}", m.PropertyName, _udsClassName)), LogCategories);
                        pMeta = pMeta.AddSimpleDataAnnotation("Required");
                    }

                    _uds.Properties.Add(pMeta);
                    _uds.ClassSyntax = _uds.ClassSyntax.AddMember(pMeta);
                }
            }
            _uds.Namespace = SyntaxFactory.NamespaceDeclaration(SyntaxFactory.IdentifierName(string.Concat("VecompSoftware.DocSuiteWeb.UDS.Entities.", _udsNamespace)));
            _uds.Namespace = _uds.Namespace.AddMembers(_uds.ClassSyntax);

            _uds.UnitSyntax = SyntaxFactory.CompilationUnit();
            _uds.UnitSyntax = _uds.UnitSyntax.AddMembers(_uds.Namespace);
            _uds.UnitSyntax = _uds.UnitSyntax.AddUsings(_uds.Usings.ToArray());
            _uds.UnitSyntax = (CompilationUnitSyntax)Formatter.Format(_uds.UnitSyntax, _workspace);
        }