0

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

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

但是使用 EF 5,我现在有一个 DBContext 并且似乎不知道如何做同样的事情。

非常感谢您的帮助。

4

2 回答 2

1

感谢神秘人,我有一个答案。这比我想象的要容易得多。

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

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

在解决方案中的 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) ..... 

或者当实体实体化时您希望发生的任何事情。在我的例子中,我只检查实体是否是包含打包字段的类型,如果是,则调用代码来解包它(它在实体的部分类中。)

享受

于 2013-07-23T20:16:37.747 回答
0

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

于 2013-08-31T02:06:18.433 回答