EF代码优先模型上的自定义属性

时间:2014-05-16 18:38:56

标签: c# entity-framework

目前在新项目中使用EF 6。我现在已经使用EF一段时间了,所以我非常熟悉它 - 至少作为它的普通用户。

我们希望在SQL(最终是Azure SQL)和Azure Table Storage之间分割数据存储。

分割的原因是实体上的一些数据并不适合关系数据库。例如,我们有一些客户希望联系人拥有属性A,B,C,D而另一个客户端更喜欢拥有F,G,H,I,J,K,L - 所以将这部分数据存储在NoSql中会更有意义因此我们不会限制自己,而不是在表格中添加几十列来处理该模型的不同要求。

我们目前在新版本中,对这些数据集进行序列化/反序列化,这虽然不理想,但还是可以的。特别是考虑到在每次读/写时执行此任务可能很昂贵。

所以 - 这引出了我的问题。 (此时无法显示代码)

我认为我可以使用自定义属性(例如[NoSqlStore])修饰某些数据模型上的特定属性,然后对这些属性作出反应。例如,我可以覆盖EF中的SaveChanges()方法,以便在实体上的任何属性包含属性时将数据保存到相应的表存储中。

至少我目前正在努力解决的困难部分是如何处理数据库中的读取。理想情况下,我希望能够在EF中侦听(或覆盖)在获取数据时触发的内容。为此,EF中是否有这样的事件/方法?我想如果我可以在填充我的模型时拦截EF,我可以对任何属性装饰作出反应。

1 个答案:

答案 0 :(得分:1)

在EF6中,您可以使用命令拦截机制,每次执行命令时都会调用拦截器。如果需要,您也可以修改结果(虽然可能有点麻烦)。 This article是一个很好的起点。另一种方法是查看ObjectContext.ObjectMaterialized事件,并在此事件的处理程序中填充EF未填充的属性。