0

我是实体框架4.0的新手,在C#中使用它,并且正在尝试使用它的功能。实体框架4 - 在生成的实体中嵌入ObjectContext参考

我注意到,就像大多数类似的ORM一样,它依赖于一个Context对象来处理在生成的实体上完成的数据操作和CRUD语句生成。

这意味着如果我想将更改保存回数据库,我总是需要能够访问实例实例化的ObjectContext的引用。

如果上下文已经在可访问的作用域(例如,同一个方法)中创建,那么这很好,但如果我将实体或实体设置为方法并希望此方法保存更改,该怎么办?它看起来像唯一简单的方法是将ObjectContext与参数一起传递。

另一种解决方案是将ObjectContext放在某种全局变量中。不用说,我发现这两种方法的样式和可维护性问题。

总而言之,我能想象的最好方法是从实体或实体集合中获取对ObjectContext的引用。 我知道这是不可能的默认情况下。

I have found a method显示添加扩展方法从实体获取ObjectContext。但是,它只适用于具有关系的实体,根据作者称这种方法是昂贵的。

我正在考虑修改T4模板来为所有实体添加一个Context属性,并自动将其填充到实体的实例上。

我已经修改了T4模板,让实体框架对我生成的类执行了最大长度(通过遵循Julie Lerman的编程实体框架4书)。 我不能说我真的很喜欢到目前为止的T4语法,但如果这是最好的/唯一的方式,那就这样吧...

有没有人已经这样做了,什么是最好的方式来处理这个和愿意分享他的T4模板或解释什么是最好的部分方法或事件挂钩以完成这件事?

使用这种方法有什么主要缺点吗? 我在想如果ObjectContext有这么多的引用可能会阻碍/延迟它被GC重新召集的能力,如果我的一些实体仍然在范围内,但实际上我已经不再使用ObjectContext了。

非常感谢。

回答

0

如果您需要将对象上下文作为参数传递给您的实体,那么您做错了事情。

通常情况下只有在定义良好的图层中才需要。这个层需要上下文到逻辑的所有类都可以通过一些专门的类上下文提供者(它也可以称为服务定位器)来接收上下文。上下文提供程序将在某个存储中保存当前上下文实例 - 您可以创建自己的或者可以按线程,按照http请求存储它。

如果他们需要多于一个上下文实例,您可以修改您的提供程序也作为工厂工作。

另一种常见方法是与依赖注入相结合。您将通过构造函数(或属性)将上下文传递给您的类,并且您将拥有一些将为您执行所有必要初始化的引导代码(创建所需实例并将所有依赖关系传递给它们)。再次,您可以通过环境或工厂。这通常与IoC容器一起使用,它将为您完成管道安装。

准备好此基础架构后,您可以将实体传递给该层中的任何初始化类,并且它将具有可用的上下文。