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

C# EF代码优先模型上的自定义属性,c#,entity-framework,C#,Entity Framework,目前正在一个新项目中使用EF 6。我已经使用EF有一段时间了,所以我对它非常熟悉——至少作为它的普通用户 我们希望在SQL(最终是Azure SQL)和Azure表存储之间拆分数据存储 拆分的原因是实体上的某些数据不适合关系数据库。例如,我们有一些客户更喜欢联系人的属性A、B、C、D,而另一个客户更喜欢F、G、H、I、J、K、L——因此将这部分数据存储在NoSql解决方案中会更有意义,这样我们就不会约束自己,而不是在一个表中添加几十列来处理该模型上的不同需求 目前,在新的构建中,我们正在序列化/

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

我们希望在SQL(最终是Azure SQL)和Azure表存储之间拆分数据存储

拆分的原因是实体上的某些数据不适合关系数据库。例如,我们有一些客户更喜欢联系人的属性
A、B、C、D
,而另一个客户更喜欢
F、G、H、I、J、K、L
——因此将这部分数据存储在NoSql解决方案中会更有意义,这样我们就不会约束自己,而不是在一个表中添加几十列来处理该模型上的不同需求

目前,在新的构建中,我们正在序列化/反序列化这些数据集,这还可以,但并不理想。尤其是在每次读/写时执行此任务可能会很昂贵的情况下

这就引出了我的问题。(此时没有要显示的代码)

我想我可以用一个自定义属性来修饰某些数据模型上的特定属性,比如
[NoSqlStore]
,然后对这些属性做出反应。例如,如果实体上的任何属性包含该属性,我可以重写EF中的
SaveChanges()
方法将数据保存到相应的表存储


最困难的部分,至少是我目前正在努力解决的问题,是如何处理从数据库读取的数据。理想情况下,我希望能够在EF中侦听(或重写)在获取数据时触发的内容。EF中是否为此内置了此类事件/方法?我想如果我能在EF填充我的模型时截取它,我就能对任何属性修饰做出反应。

在EF6中,你可以使用命令截取机制,每次执行命令时都会调用截取器。如果需要,还可以修改结果(不过可能有点麻烦)。这是一个很好的起点。另一种方法是查看事件,并在该事件的处理程序中填充EF未填充的属性。

谢谢。我已经看过了,这似乎是一个好的开始。我已经创建了一个快速而肮脏的类来拦截命令。知道我是如何得到这个命令应该运行的模型的吗?(有意义吗?)我想知道你是否不应该仅仅[忽略]你不想要的属性。否则,它可能很难工作(在处理linq查询时,我发现无法将linq查询与您在命令拦截器中看到的Sql命令关联起来,并最终使用了包装提供程序。区别在于我不必修改结果,这是非常棘手的(如果不是不可能的话)是的,我们可以忽略一些属性,这将确保EF不会对它们做任何处理,尽管在这些属性上我需要用NoSql中的数据填充它们。被忽略的属性可能是一个复杂的对象,根据客户的不同,它可能包含不同的属性;因此,希望将其存储在noSql中,因为它不必遵循结构。这样可能会比您想象的更简单-订阅
ObjectContext.ObjectMaterialized
event(),并在那里填充不由EF填充的属性。这太棒了,谢谢。我现在订阅了这个活动——如果你也能在回答中写上这句话,我很乐意将其标记为已回答。还有一点需要注意的是,我必须同时执行这两项操作,因为在执行投影时不会触发ObjectMaterialized。我确信您的情况比您所建议的更复杂,但如果不是,简单地使用可配置属性并不是选择NoSql的一个好理由,在关系模型中执行这项操作非常容易。如果你在一个非关系模型中有大量数据,NoSql真的会大放异彩,但是如果你的数据需求很小,你可以通过关系模拟键值存储。我试着让一些信息尽可能简单,以免偏离实际问题。有大量数据没有遵循典型的关系数据库设计。在sql和nosql之间分割数据实际上会显著提高我们的系统性能以及满足客户需求所涉及的许多过程。