использование класса модели метаданных EF с перехватом свойства postsharp не работает

Я написал LocationInterceptionAspect, используя PostSharp. Он должен работать в приложении MVC5 с EF6, когда вызывается установщик или получатель класса модели EF. Аспект вызывается правильно, когда я добавляю аннотацию к автоматически сгенерированному классу модели. Поскольку это недопустимый вариант, я попытался добавить аннотацию к соответствующему классу метаданных.

Это работает:

public partial class Company
{
  [Encrypt]      
  public string name{ get; set; }
}

Это не работает:

[MetadataType(typeof(CompanyMetadata))]
public partial class Company
{

}
internal sealed class CompanyMetadata
{
    [Encrypt]       // does not work
    [Requiered]     // works 
    public string name{ get; set; }
}

Если я добавлю другие аннотации в качестве аннотации [Required], функциональность этой аннотации будет выполнена. Я пробовал размещать аннотацию [Encrypt] в других местах - всегда работает. Только в классе метаданных у меня проблема, что аспект не вызывается.

У кого-то есть идея? Спасибо за помощь!


person heike    schedule 23.10.2015    source источник


Ответы (1)


Entity Framework использует тип, указанный в [MetadataType], в качестве источника метаданных. Логика свойств в типе метаданных не имеет значения.

Поскольку PostSharp изменяет реализацию этих свойств, вы не увидите никакой разницы в поведении.

Что вам нужно сделать, так это применить аспект непосредственно к свойству сгенерированного класса Company. Поскольку у вас нет доступа к исходному коду (он сгенерирован), вам необходимо "многоадресно передать" аспект всем нужным вам свойствам.

Самый простой способ сделать следующее:

[Encrypt(AttributeTargetMembers = "name", 
         AttributeTargetElements = MulticastTargets.Property)]
public partial class Table
{
}

Это говорит PostSharp применить аспект уровня местоположения к свойствам с именем «имя» в целевом классе. Так как класс присутствует в сборке, он будет корректно изменен.

person Daniel Balas    schedule 30.10.2015