【问题标题】:using EF metadatatype model class with postsharp property interception not working使用带有 postsharp 属性拦截的 EF 元数据类型模型类不起作用
【发布时间】:2015-10-23 21:05:59
【问题描述】:

我使用 PostSharp 编写了一个 LocationInterceptionAspect。当调用 EF 模型的类的 setter 或 getter 时,它应该在带有 EF6 的 MVC5 应用程序中运行。 当我将注释添加到自动生成的模型类时,该方面被正确调用。由于这不是一个有效的选项,我尝试将注释添加到相应的元数据类型类中。

这行得通:

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

如果我将其他注释添加为 [Requiered] 注释,则将执行此注释的功能。 我试图将 [Encrypt] 注释放在其他地方 - 它总是有效的。只有在 metadatatype 类中,我有没有调用方面的问题。

有人有想法吗? 感谢您的帮助!

【问题讨论】:

    标签: c# entity-framework annotations postsharp metadatatype


    【解决方案1】:

    Entity Framework 使用[MetadataType] 中指定的类型作为元数据的来源。元数据类型中的属性逻辑无关紧要。

    由于 PostSharp 更改了这些属性的实现,因此您不会看到任何行为差异。

    您需要做的是直接在生成的类Company 的属性上应用方面。由于您无权访问源代码(它是生成的),因此您需要在所需的所有属性上“多播”方面。

    最简单的方法是执行以下操作:

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

    这告诉 PostSharp 将位置级别方面应用于目标类上名为“name”的属性。由于该类存在于程序集中,因此将正确更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      相关资源
      最近更新 更多