0

我是 Entity Framework 4.0 的新手,在 C# 中使用它,目前正在试验它的功能。

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

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

如果上下文是在可访问范围(例如,相同的方法)中创建的,那很好,但是如果我将实体或实体集传递给方法并希望此方法保存更改怎么办?看起来唯一简单的方法是将 ObjectContext 与参数一起传递。

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

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

我找到了一种显示添加扩展方法以从实体获取 ObjectContext 的方法。但是,它仅适用于具有关系的实体,并且根据作者的说法,调用此方法的成本很高。

我正在考虑修改 T4 模板以向我的所有实体添加一个 Context 属性,并在实体的实例化时自动填充它。

我已经修改过一次 T4 模板,让 Entity Framework 在我生成的类上强制执行 Max Length(按照 Julie Lerman 的 Programming Entity Framework 4 书)。到目前为止,我不能说我真的很喜欢 T4 语法,但如果这是最好/唯一的方法,那就这样吧……

有没有人已经这样做了?处理这个问题的最佳方法是什么,并愿意分享他的 T4 模板或解释什么是最好的部分方法或事件来完成这项工作?

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

非常感谢。

4

1 回答 1

0

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

通常只有在定义明确的层中才需要上下文。该层中所有需要上下文到其逻辑的类都可以通过一些专门的类 - 上下文提供者(也可以称为服务定位器)接收上下文。上下文提供者将在一些存储中保存当前上下文实例 - 您可以创建自己的,也可以按线程、每个 http 请求等存储它。

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

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

一旦你准备好这个基础设施,你就可以将你的实体传递给该层的任何初始化类,它就会有可用的上下文。

于 2011-08-19T08:39:16.213 回答