我正在使用Entity Framework 5和Code First方法,并使用Fluent API进行实体配置.我的项目有一个特定的产品实体,它从数据库中获取一半数据,另一半来自通过WCF客户端(用于管理产品库存的第三方系统)检索的数据合同.数据合同是Product Entity类的成员(我尚未决定的属性或方法).
我不希望在实体中包含任何WCF客户端逻辑.我更喜欢将此逻辑保存在存储库代码(DbContext,DbSet等)中.
那么在从数据库中检索产品实体之后是否有一种挂钩到实体框架(或拦截)的技术?我应该注意,产品实体在其他实体上显示为导航属性.如果钩子或拦截是可能的,那么这意味着我可以在EF从数据库加载产品实体后立即从SOAP服务检索数据合同.我的项目的好处是WCF客户端检索代码不需要在整个应用程序中重复.
我的一个想法是为数据契约实现IDbSet,IDbSet将负责检索它.然后以某种方式欺骗EF认为它在产品实体上的导航属性.但我不确定数据库DbSet是否可以在同一个DbContext中与非数据库IDbSet混合.还有另外一个问题 - EF如何知道从IDbSet植入中检索导航属性?在投入时间之前,我更愿意知道这个想法是否可行.我也想知道从哪里开始寻找.
请注意我已经使用.NET超过10年,但这个EF5的东西对我来说还是比较新的.
提前致谢.
萨姆
实现 IDbCommandInterceptor 时,我可以访问为命令/查询创建的 SQL 命令。是否还可以访问在实现的方法中持久/检索的实际实体对象?
这是一些幻想代码来演示我想做的事情:
public class WidgetInterceptor : IDbCommandInterceptor
{
public void NonQueryExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
{
var widget = interceptionContext.Entity as Widget;
if(widget != null)
{
//Perform tasks on widget before it is saved...
}
}
}
Run Code Online (Sandbox Code Playgroud)