使用EDMX EF 6.0的DataAnnotations不起作用

时间:2015-02-16 04:36:21

标签: entity-framework attributes metadata data-annotations

我的模型中有一个.EDMX,来自EF 6.0,我想在我的某些字段中添加属性。我已经阅读了许多使用DataAnnotations和MetadataType的例子......我试图实现它,但它没有覆盖...例如,如果我有

[Queryable]
public string Name;

它不起作用。

但如果我有

[Queryable]
public string Name2;

它会工作,我会看到Name2作为属性的一部分!

我用来查找这些属性的代码如下:

var properties = typeof(TEntity).GetProperties().Where(prop => prop.IsDefined(typeof(QueryableAttribute), false));

就像我说的,当我有Name2时,我可以在属性列表中找到它。当我有姓名时,我不会......

这是我的3个文件,它们都在" MMS.Entities"命名空间

AreaMetadata.cs

    namespace MMS.Entities
{
    [MetadataType(typeof(AreaMetadata))]
    public partial class Area 
    {}

    public class AreaMetadata
    {
        [Queryable]
        public string Name;
        [Queryable]
        public string Abbreviation;
        [Queryable]
        public string Description;
    }
}

Area.cs

namespace MMS.Entities
    {
        using MMS.Common.Utilities;
        using System;
        using System.Collections.Generic;
        using System.ComponentModel.DataAnnotations;

        public partial class Area : Entity, IEntity
        {
            public Area()
            {
                this.Plants = new HashSet<Plant>();
            }

            public int Id { get; set; }
            public string Name { get; set; }
            public string Abbreviation { get; set; }
            public string Description { get; set; }
            public bool IsActive { get; set; }
            public bool IsDeleted { get; set; }
            public int UserCreatedId { get; set; }
            public Nullable<int> UserModifiedId { get; set; }
            public System.DateTime DateCreated { get; set; }
            public Nullable<System.DateTime> DateModified { get; set; }

            public virtual ICollection<Plant> Plants { get; set; }
        }
    }

AreaMetadata.cs的名称是否应该不同?我是否应该在某处包含任何内容以使它们一起工作?

感谢您的建议!

1 个答案:

答案 0 :(得分:1)

我相信类似的问题已得到解答here

当您尝试访问MetadataType属性属性时,您必须使用反射来访问MetadataType,而不仅仅是使用MetadataType的类。我提供的链接中有一个解释,以及如何获得它的示例。

基本上,使用反射来获取AreaMetadata属性,而不是Area属性。

尝试:

    MetadataTypeAttribute metadata = typeof(TEntity)
        .GetCustomAttributes(typeof(MetadataTypeAttribute), true)
        .OfType<MetadataTypeAttribute>().ToArray().FirstOrDefault();    

    PropertyInfo[] properties = metadata.MetadataTypeClass.GetProperties()
        .Where(prop => prop.IsDefined(typeof(Queryable), false));