2015-02-16 3 views
1

У меня есть .EDMX с моими моделями от EF 6.0, и я хочу добавить атрибуты в некоторые из моих полей. Я прочитал много примеров, когда они используют DataAnnotations с MetadataType ... Я пытался реализовать, но это не отменяет ... Например, если у меня естьDataAnnotations с EDMX EF 6.0 не работает

[Queryable] 
public string Name; 

это не будет работать.

, но если у меня есть

[Queryable] 
public string Name2; 

Это будет работать, и я буду видеть Имя2 как часть атрибутов!

код я использую для того, чтобы найти эти атрибуты выглядит следующим образом:

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

Как я уже сказал, когда я Имя2, я могу найти его в списке атрибутов. И когда у меня есть имя, я не ...

вот мои 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 быть другим? Должен ли я включать что-нибудь где-нибудь, чтобы заставить их работать вместе?

Спасибо за ваши советы!

+0

В примере я представил, я забыл поставить {получить; задавать; } в свойствах выше ... но это не моя проблема, так как у меня есть они уже в моем коде. –

+0

Может быть, свойства AreaMetadata сначала вызываются и переопределяются свойствами Area.cs? Возможно ли это? Если да, то как мне удастся сначала вызвать EDMX и добавить метаданные? –

ответ

1

Я считаю, что на подобный вопрос был дан ответ here.

При попытке получить доступ к атрибуту свойства MetadataType, вы должны перейти к MetadataType, используя отражение, а не просто класс, который использует MetadataType. В приведенной ссылке есть объяснение и пример того, как ее получить.

В принципе, используйте отражение, чтобы получить свойства AreaMetadata, а не свойства Area.

Try:

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

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

Спасибо! он работает красиво! Ура! –