使用代码优先实体框架6.1向属性添加属性以覆盖实体类中的get /set



因为我想为一些实体以JSON方式添加一些字符串列的本地化,我希望添加一个属性,我可以添加到可以处理此逻辑的属性中。

所以我想把我的字符串保存在数据库中,像:

[{'en':'Hello', 'nl':'Hallo', 'fr':'Bonjour'}]
然后,当获得此属性时,我想添加一些逻辑,以便根据当前文化返回正确的语言。我可以管理编写这个逻辑,但我想知道是否有可能编写像Actionfilter(属性)这样的东西,这是可能的,如何?正如你所看到的,我想全局重写用这个属性装饰的属性的getter和setter。属性位于EF的实体类中。

本地化以及安全性、租赁等方面都是横切关注点。

其他一些ORM对过滤器有开箱即用的支持,允许实体在上下文级别对它们应用全局过滤器。

这允许上下文中的所有查询通过横切关注点的某些方面进行过滤。在您的示例中,当前位置。

通过EntityFramework对实体框架的过滤器提供了附加支持。这里过滤OSS项目:https://github.com/jbogard/EntityFramework.Filters.

这个可以像这样

  1. 在http请求管道的某个地方,创建上下文来服务该请求并在上下文上启用本地化过滤器。将过滤器上的本地化属性设置为当前区域性令牌。
  2. 在请求内的所有数据库操作中重用此上下文。这样,针对上下文执行的所有查询都将有应用于它们的本地化过滤器
  3. 您的本地化过滤器将需要编写,以附加where子句到您的字符串查找实体,以根据当前区域性
  4. 过滤实体

一些非常粗糙的示例代码:

在你的上下文中

protected override void OnModelCreating(...)
{
    modelBuilder.Entity<Strings>().
        Filter("localisation", 
        // setup up your localisation filter

在asp.net mvc管道中的某处(例如在身份验证过滤器中)

// Create context
var myContext = ..
// Enable the localisation filter using the current cutler
myContext.EnableFilter("localisation").
    SetParameter("culture", "en");

请原谅我的示例代码的性质——自从我在现有的项目中设置过滤器以来,我还没有使用过过滤器,而且我一时想不起来语法。GitHub项目站点有一个很好的工作示例:

最新更新