【问题标题】:Attaching MetaData class to ADO.NET Entity Data model classes将 MetaData 类附加到 ADO.NET 实体数据模型类
【发布时间】:2011-10-23 18:34:58
【问题描述】:

我在将元数据类附加到 ADO.NET 实体数据模型生成的类时遇到问题。 根据以下链接...

http://blogs.microsoft.co.il/blogs/gilf/archive/2011/01/20/adding-metadata-to-entities-in-the-data-model.aspx

http://msdn.microsoft.com/en-us/library/cc679243.aspx

http://goneale.com/2009/03/04/using-metadatatype-attribute-with-aspnet-mvc-xval-validation-framework/

http://davidhayden.com/blog/dave/archive/2008/01/06/ASPNETDynamicDataTutorialBuddyMetadataProviderCustomMetadataProviders.aspx

http://davidhayden.com/blog/dave/archive/2008/05/15/DynamicDataWebsitesScaffoldTableScaffoldColumnAttributes.aspx

我创建了一个元数据类来为属性添加一些属性。我可以将此属性添加到生成的类中的属性并且它可以工作,但我想避免在每次必须更新和重新创建我的 ADO.NET 实体数据模型时丢失此属性。

我的问题是,我做错了什么?为什么在运行时属性中没有我的自定义属性?

这是生成的数据类的一部分

[EdmEntityTypeAttribute(NamespaceName="HelpMeHowModel", Name="Article")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
[MetadataType(typeof(ArticleMetaData))]
public partial class Article : EntityObject
{
    #region Primitive Properties

    /// <summary>
    /// No Metadata Documentation available.
    /// </summary>
    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.Boolean IsPublished
    {
        get
        {
            return _IsPublished;
        }
        set
        {
            OnIsPublishedChanging(value);
            ReportPropertyChanging("IsPublished");
            _IsPublished = StructuralObject.SetValidValue(value);
            ReportPropertyChanged("IsPublished");
            OnIsPublishedChanged();
        }
    }
    private global::System.Boolean _IsPublished;
    partial void OnIsPublishedChanging(global::System.Boolean value);
    partial void OnIsPublishedChanged();

...

..这是我的元数据类

public class ArticleMetaData
{
    #region Primitive Properties

    [BoolFunction(BoolFunction.ThreeStateRadioButton)]
    public global::System.Boolean IsPublished { get; set; }

【问题讨论】:

标签: asp.net ado.net entity metadata


【解决方案1】:

对于所有寻找相同问题解决方案的人...

向部分 MetadataType 类添加自定义属性是可能的,它可以工作,但有一个小问题。

使用

PropertyInfo pi;

pi.GetCustomAttributes(...) 

将仅从主类获取属性,而不是从用作 MetadataType 的类中获取。

基于此处解释的解决方案

Attribute.IsDefined doesn't see attributes applied with MetadataType class

我为 PropertyInfo 类创建了两个扩展方法来获取所有属性。

namespace FAIN.Framework.Commons
{
    public static class PropertyInfoEx
    {
        public static object[] GetAllCustomAttributes(this PropertyInfo pi, bool inherit)
        {
            return GetAllCustomAttributes(pi, null, inherit);
        }
        /// <summary>
        /// Get Custom Attributes + attributes added in MetadataType
        /// </summary>
        /// <param name="pi"></param>
        /// <param name="attributeType"></param>
        /// <param name="inherit"></param>
        /// <returns></returns>
        public static object[] GetAllCustomAttributes(this PropertyInfo pi, Type attributeType, bool inherit)
        {
            if (pi == null) return null;
            List<object> allAttributes = new List<object>();
            object[] attributes = null;
            if (attributeType != null)
            {
                attributes = pi.GetCustomAttributes(attributeType, inherit);
            }
            else
            {
                attributes = pi.GetCustomAttributes(inherit);
            }
            allAttributes.AddRange(attributes);

            // search all the Metadata of the class declaring the property to get all CustomAttributes if there are any
            MetadataTypeAttribute[] metadataTypes = pi.DeclaringType.GetCustomAttributes(typeof(MetadataTypeAttribute), true).OfType<MetadataTypeAttribute>().ToArray();
            foreach (MetadataTypeAttribute metadata in metadataTypes)
            {

                if (metadata != null)
                {
                    PropertyInfo[] properties = metadata.MetadataClassType.GetProperties();
                    PropertyInfo propertyInfo = properties.Where(p => p.Name == pi.Name).FirstOrDefault();
                    if (propertyInfo != null)
                    {
                        if (attributeType != null)
                        {
                            attributes = propertyInfo.GetCustomAttributes(attributeType, inherit);
                        }
                        else
                        {
                            attributes = propertyInfo.GetCustomAttributes(inherit);
                        }
                        allAttributes.AddRange(attributes);
                    }
                }
            }

            return allAttributes.ToArray();
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 2020-03-04
    • 2018-10-03
    • 2018-11-20
    • 2011-12-07
    • 1970-01-01
    • 2018-01-07
    相关资源
    最近更新 更多