实体框架5 onObjectMaterialized缺少?

时间:2013-07-21 19:23:41

标签: entity-framework entity-framework-5

我搜索了我在EF 4中使用的onObjectMaterialized,以便在实体实现后立即运行代码。但只发现了3个答案,没有人真的有帮助。

在EF4中,我记得编辑VS.NET EF模板,然后更新VS.NET以使用那些导致ObjectContext启用支持的新模板。

但是使用EF 5,我现在有一个DBContext,似乎无法找到如何做同样的事情。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

感谢Mystere Man,我有一个答案。它比我想象的容易得多。

其他人可能有不同的方法,但关键信息是相同的。

为您的上下文创建一个分部类。这不是必需的,但它有助于将代码与生成的代码隔离开来。

在xxxModel.edmx下解决方案应该是4个单独的文件。打开以.tt结尾的那个。这是模板。

在模板中,在模板代码之后添加对方法的调用以创建构造函数。模板代码应该类似于:

<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext
    {
        public <#=code.Escape(container)#>()
            : base("name=<#=container.Name#>")
        {
            // Put your method call here 
            MyConstructor();

现在,在您的部分类(或模板中,如果您不使用部分类),定义方法并添加Mystere Man中的代码。

protected void MyConstructor()
    {
        ((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += this.ObjectContext_OnObjectMaterialized;
    }

然后你只需要添加你的方法:

public void ObjectContext_OnObjectMaterialized(Object sender, ObjectMaterializedEventArgs e)
    {
        if (e.Entity is IMyEntityClass) ..... 

或实体实现时您想要发生的任何事情。在我的例子中,我只检查实体是否是包含压缩字段的类型,如果是,则调用代码将其解包(在实体的部分类中。)

享受

答案 1 :(得分:0)

更好的解决方案是消除整个edmx事物并使用反向代码优先方法。这最终效率更高,我不必在edmx中使用xml玩游戏。