我搜索了我在 EF 4 中使用的 onObjectMaterialized,以便在实体化后立即运行代码。但只找到 3 个答案,没有一个真正有帮助。
在 EF4 中,我记得编辑 VS.NET EF 模板,然后更新 VS.NET 以使用那些导致 ObjectContext 启用支持的新模板。
但是使用 EF 5,我现在有一个 DBContext 并且似乎不知道如何做同样的事情。
非常感谢您的帮助。
我搜索了我在 EF 4 中使用的 onObjectMaterialized,以便在实体化后立即运行代码。但只找到 3 个答案,没有一个真正有帮助。
在 EF4 中,我记得编辑 VS.NET EF 模板,然后更新 VS.NET 以使用那些导致 ObjectContext 启用支持的新模板。
但是使用 EF 5,我现在有一个 DBContext 并且似乎不知道如何做同样的事情。
非常感谢您的帮助。
感谢神秘人,我有一个答案。这比我想象的要容易得多。
其他人可能有不同的方法,但关键信息是相同的。
为您的上下文创建一个部分类。这不是必需的,但它有助于将您的代码与生成的代码隔离开来。
在解决方案中的 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) .....
或者当实体实体化时您希望发生的任何事情。在我的例子中,我只检查实体是否是包含打包字段的类型,如果是,则调用代码来解包它(它在实体的部分类中。)
享受
一个更好的解决方案是消除整个 edmx 事物并使用反向代码优先方法。这最终效率更高,我不必在 edmx 中使用 xml 玩游戏。