/// <summary> /// Επιστρέφει τα μεταδεδομένα ενός παραμετρικού πεδίου της οντότητας /// </summary> /// <param name="customFieldId">Το ID του παραμετρικού πεδίου</param> /// <returns></returns> public ColumnMetadata GetCustomColumnMetadata(int customFieldId) { if (HasCustomColumn(customFieldId)) { return(Columns .Select(c => c.Value) .FirstOrDefault(c => c.IsCustomColumn && c.CustomFieldId == customFieldId)); } throw MetadataException.NonExistentCustomColumn(customFieldId, EntityName); }
/// <summary> /// Επιστρέφει το όνομα του πίνακα που είναι συσχετισμένος με την όντότητα /// </summary> /// <param name="entityType">Ο τύπος της κλάσης που έχει μαρκαριστεί ως οντότητα</param> /// <returns></returns> /// <exception cref="MetadataException">Πετάει εξαίρεση σε περίπτωση που η οντότητα δεν έχει μαρκαριστεί με το <see cref="TableAttribute"/></exception> public static string GetTableName(Type entityType) { TableAttribute table = entityType.GetCustomAttribute <TableAttribute>(); if (table == null) { throw MetadataException.MissingTableAttribute(entityType); } return(table.TableName); }
/// <summary> /// Επιστρέφει τα μεταδεδομένα μιας στήλης /// </summary> /// <param name="columnName">Το όνομα της στήλης</param> /// <returns></returns> /// <exception cref="MetadataException">Πετάει exception εάν δεν υπάρχει η στήλη στην οντότητα</exception> public ColumnMetadata GetColumnMetadata(string columnName) { if (ContainsColumn(columnName)) { return(Columns .Select(c => c.Value) .FirstOrDefault(c => c.ColumnName == columnName)); } throw MetadataException.NonExistentColumn(columnName, EntityName); }
/// <summary> /// Δημιουργεί ένα νέο αντικείμενο μεταδεδομένων οντότητας /// </summary> /// <param name="EntityType">Ο τύπος της κλάσης που έχει μαρκαριστεί ως οντότητα</param> public ClassMetadata(Type EntityType) { this.EntityType = EntityType ?? throw new ArgumentNullException(nameof(EntityType)); if (!IsEntity(this.EntityType)) { throw MetadataException.InvalidEntity(this.EntityType); } EntityName = this.EntityType.Name; CacheKey = GetCacheKey(this.EntityType); TableName = GetTableName(this.EntityType); Columns = GetColumns(this.EntityType); try { //Εαν η οντότητα δεν έχει καμία στηλή με το IdentifierAttribute, η παρακάτω //γραμμή θα σκάσει και θα μας πάρει στο λαιμό της. Εξ ού και το try-catch IdentifierColumn = Columns .Select(c => c.Value) .First(c => c.IsIdentifier).ColumnName; } catch (Exception) { throw MetadataException.MissingIdentifierAttribute(EntityName); } //Σε αντίθεση με παραπάνω, οι οντότητες δεν είναι υποχρεωμένες να έχουν //παραμετρικά πεδία ή (πιο κάτω) στήλη Guid, οπότε εδώ αρκούν απλοί έλεγχοι //για την ύπαρξη παραμετρικών ή στήλης Guid if (HasCustomColumns()) { CustomTable = Columns .Select(c => c.Value) .FirstOrDefault(c => c.IsCustomColumn) ?.CustomFieldTable ?? string.Empty; CustomReferenceColumn = Columns .Select(c => c.Value) .FirstOrDefault(c => c.IsCustomColumn) ?.CustomFieldReference ?? string.Empty; } if (HasGuidColumn()) { GuidColumn = Columns .Select(c => c.Value) .FirstOrDefault(c => c.IsRowGuid) ?.ColumnName ?? string.Empty; } CacheControlAttribute cacheAttr = this.EntityType.GetCustomAttribute <CacheControlAttribute>(); if (cacheAttr != null) { CacheDuration = cacheAttr.Duration; NoCache = cacheAttr.NoCache; } SupportsOptimisticLocking = Columns .Select(c => c.Value) .Any(c => c.IsVersion); if (SupportsOptimisticLocking) { VersionColumn = Columns .Select(c => c.Value) .FirstOrDefault(c => c.IsVersion) ?.ColumnName ?? string.Empty; } }