我搜索了我在EF 4中使用的onObjectMaterialized,以便在实体实现后立即运行代码。但只发现了3个答案,没有人真的有帮助。
在EF4中,我记得编辑VS.NET EF模板,然后更新VS.NET以使用那些导致ObjectContext启用支持的新模板。
但是使用EF 5,我现在有一个DBContext,似乎无法找到如何做同样的事情。
非常感谢您的帮助。
答案 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玩游戏。