【问题标题】:how to add extend breeze entity types with metadata pulled from property attributes如何使用从属性属性中提取的元数据添加扩展微风实体类型
【发布时间】:2014-10-28 21:37:40
【问题描述】:

我想在微风数据服务(客户端)中获取下面提到的自定义属性。

namespace Tam.Framework.Web.Models
{
    [ViewAttribute("app/views/Employee.html")]//this custom class attribute
    public class Employee : BaseEntity
    {
        protected override string OnGetDescriptor()
        {
            return "some description";
        }

        public string FirstName { get; set; }

        [Display(Name = "LAST NAME")]//this custom property attribute
        public string LastName { get; set; }
    }
}

【问题讨论】:

    标签: entity-framework attributes breeze


    【解决方案1】:

    在服务器上,向元数据控制器操作添加逻辑,以使用显示属性属性补充标准元数据:

    [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();
    }
    

    在客户端,获取元数据并使用自定义元数据补充微风实体类型。

    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);
    });
    

    现在微风实体类型中提供了额外的元数据...

    var propertyDisplayName = myEntity.entityType.getProperty('lastName').displayName;
    

    【讨论】:

    • 感谢 Jeremy,我使用了该函数并添加了自定义属性,但我在最后一步出现错误 myEntity.entityType.getProperty('lastName').displayName;// displayName undefined
    • 确认在您的解决方案中设置正确,在此行的服务器代码中设置断点:breezePropertyInfo["displayName"] = displayName;。然后在此行的客户端代码中设置另一个断点:entityProperty.displayName = metadataProperty.displayName;。您应该同时达到两个断点。当断点被命中时,确认propertyInfo / entityProperty 变量包含您期望的属性。
    • 我检查了两个作业并且是正确的,但我认为更新元数据有问题你能检查一下吗?我不知道这个配置是否正确.... function configureBreezeManager() { blink.NamingConvention.camelCase.setAsDefault(); var mgr = new 微风.EntityManager('api/breeze'); mgr.fetchMetadata(function (metadata) { return initializeMetadataStore(mgr.metadataStore, metadata); }); model.configureMetadataStore(mgr.metadataStore);返回经理; };
    【解决方案2】:
    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
         }
        }
    

    当我通过 readData 函数获取实体列表时,该列表 (observableResults[0]) 没有任何 displayName 但我添加了 displayName 并通过 initializeMetadataStore 函数检查它是否正确

    终于!!!!我发现它是因为微风.NamingConvention.camelCase.setAsDefault();

    【讨论】:

      猜你喜欢
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      相关资源
      最近更新 更多