how to add extend breeze entity types with metadata pulled from property attributes

前端 未结 2 1816
情书的邮戳
情书的邮戳 2020-12-12 07:19

I want to get the custom attributes, mentioned below, in breeze dataService (client side).

namespace Tam.Framework.Web.Models
{
    [ViewAttribute(\"app/view         


        
相关标签:
2条回答
  • 2020-12-12 07:46
    var manager = configureBreezeManager();
    
            function configureBreezeManager() {
    
            breeze.NamingConvention.camelCase.setAsDefault();
            var mgr = new breeze.EntityManager('api/breeze');
            model.configureMetadataStore(mgr.metadataStore);
            mgr.fetchMetadata(function (metadata) {
                return initializeMetadataStore(mgr.metadataStore, metadata);
            });
            return mgr;
        };
    
    
    
    
           function initializeMetadataStore(metadataStore, metadata) {
            breeze.NamingConvention.defaultInstance = breeze.NamingConvention.none;
            var metadataType, metadataProperty, entityProperty, i, j;
            for (i = 0; i < metadata.schema.entityType.length; i++) {
                metadataType = metadata.schema.entityType[i];
                var entityType = metadataStore.getEntityType(metadataType.name);
                for (j = 0; j < metadataType.property.length; j++) {
                    metadataProperty = metadataType.property[j];
    
                        entityProperty = entityType.getProperty(metadataProperty.name);
    
                    if (entityProperty) {
                        if (typeof metadataProperty.displayName !== 'undefined') {
                            entityProperty.displayName = metadataProperty.displayName;
                        }
                        if (typeof metadataProperty.displayOrder !== 'undefined') {
                            entityProperty.displayOrder = metadataProperty.displayOrder;
                        }
                        if (typeof metadataProperty.autoGenerateField !== 'undefined') {
                            entityProperty.autoGenerateField = metadataProperty.autoGenerateField;
                        }
                        if (typeof metadataProperty.allowEmptyStrings !== 'undefined') {
                            entityProperty.allowEmptyStrings = metadataProperty.allowEmptyStrings;
                        }
                    }
                }
            }
    
        }
    
    
    
    
    
            var readData = function (entityName, observableResults, showLog) {
    
            if (!entityName || !observableResults)
                return null;
    
            var query = new breeze.EntityQuery()
                .from(entityName);
    
    
            return manager.executeQuery(query)
             .then(querySucceeded)
             .fail(queryFailed);
        }
    
        function readEmployee() {
        return breezeDataService.readData("Employees", employees, true).then(function () {
    
            var propertyDisplayName = employees()[0].entityType.getProperty('lastName').displayName;//error displayName undefined
         }
        }
    

    when I get list of entity by readData function that list (observableResults[0]) have not any displayName but I add displayName and checked it by initializeMetadataStore function is correct

    FINALLY!!!!! I found it it because of breeze.NamingConvention.camelCase.setAsDefault();

    0 讨论(0)
  • 2020-12-12 07:52

    On the server, add logic to the Metadata controller action to supplement the standard metadata with the display attribute properties:

    [HttpGet]
    public virtual string Metadata()
    {
        // Extend metadata with extra attributes
        var metadata = JObject.Parse(this.ContextProvider.Metadata());
        var ns = metadata["schema"]["namespace"].ToString();
        foreach (var breezeEntityType in metadata["schema"]["entityType"])
        {
            var typeName = ns + "." + breezeEntityType["name"].ToString();
            var entityType = BuildManager.GetType(typeName, true);
    
            foreach (var propertyInfo in entityType.GetProperties())
            {
                var attributes = propertyInfo.GetAllAttributes();
                var breezePropertyInfo = breezeEntityType["property"].SingleOrDefault(p => p["name"].ToString() == propertyInfo.Name);
                if (breezePropertyInfo == null)
                    continue;
    
                // handle display attribute...
                var displayAttribute = attributes.OfType<DisplayAttribute>().FirstOrDefault();
                if (displayAttribute != null)
                {
                    var displayName = displayAttribute.GetName();
                    if (displayName != null)
                        breezePropertyInfo["displayName"] = displayName;
                    var displayOrder = displayAttribute.GetOrder();
                    if (displayOrder != null)
                        breezePropertyInfo["displayOrder"] = displayOrder;
                    var autogenerateField = displayAttribute.GetAutoGenerateField();
                    if (autogenerateField != null)
                        breezePropertyInfo["autoGenerateField"] = autogenerateField;
                }
    
                // allowEmptyStrings.
                if (propertyInfo.PropertyType == typeof(string))
                {
                    breezePropertyInfo["allowEmptyStrings"] = true;
                    var requiredAttribute = attributes.OfType<RequiredAttribute>().FirstOrDefault();
                    if (requiredAttribute != null && !requiredAttribute.AllowEmptyStrings)
                        breezePropertyInfo["allowEmptyStrings"] = false;
                }
    
                // todo: handle other types of attributes...
            }
        }
    
        return metadata.ToString();
    }
    

    On the client, fetch the metadata and supplement the breeze entity type with the custom metadata.

    function initializeMetadataStore(metadataStore, metadata) {
        var metadataType, metadataProperty, entityProperty, i, j;
        for (i = 0; i < metadata.schema.entityType.length; i++) {
            metadataType = metadata.schema.entityType[i];
            var entityType = metadataStore.getEntityType(metadataType.name);
            for (j = 0; j < metadataType.property.length; j++) {
                metadataProperty = metadataType.property[j];
                entityProperty = entityType.getProperty(metadataProperty.name);
                if (entityProperty) {
                    if (typeof metadataProperty.displayName !== 'undefined') {
                        entityProperty.displayName = metadataProperty.displayName;
                    }
                    if (typeof metadataProperty.displayOrder !== 'undefined') {
                        entityProperty.displayOrder = metadataProperty.displayOrder;
                    }
                    if (typeof metadataProperty.autoGenerateField !== 'undefined') {
                        entityProperty.autoGenerateField = metadataProperty.autoGenerateField;
                    }
                    if (typeof metadataProperty.allowEmptyStrings !== 'undefined') {
                        entityProperty.allowEmptyStrings = metadataProperty.allowEmptyStrings;
                    }
                }
            }
        }
    }
    
    var entityManager = ....something...;
    entityManager.fetchMetadata(function (metadata) {
        return initializeMetadataStore(entityManager.metadataStore, metadata);
    });
    

    now the additional metadata is available in the breeze entity type...

    var propertyDisplayName = myEntity.entityType.getProperty('lastName').displayName;
    
    0 讨论(0)
提交回复
热议问题