我是Entity Framework 4.0的新手,在C#中使用它,目前正在尝试其功能。
我注意到,与大多数类似的ORM一样,它依赖于Context对象来处理在生成的实体上完成的数据操作和CRUD语句生成。
这意味着如果我想将更改保存回数据库,我总是需要能够访问对已实例化实体的ObjectContext的引用。
如果在可访问的作用域中创建了上下文(例如,相同的方法),那么这很好,但是如果我将实体或实体集传递给方法并希望此方法保存更改,该怎么办?看起来唯一简单的方法是将ObjectContext与参数一起传递。
另一个解决方案是将ObjectContext放在某种全局变量中。 不用说,我发现这两种方法都存在样式和可维护性问题。
简而言之,我能想象的最好方法是从实体或实体集中获取对ObjectContext的引用。 我知道默认情况下不可能。
I have found a method显示添加扩展方法以从实体获取ObjectContext。但是,它仅适用于具有关系的实体,并且根据作者调用此方法的费用很高。
我在考虑修改T4模板,为我的所有实体添加一个Context属性,并在实体的实例上自动填充。
我已经修改了T4模板一次,让Entity Framework在我生成的类上强制执行Max Length(遵循Julie Lerman的编程实体框架4书)。 到目前为止,我不能说我真的很喜欢T4语法,但如果这是最佳/唯一的方式,那就这样吧......
有没有人已经这样做了,最好的办法是什么,并愿意分享他的T4模板或解释什么是最好的部分方法或事件来完成这个?
使用这种方法有任何重大缺点吗? 我认为,如果我的一些实体仍在范围内,那么对ObjectContext的这么多引用可能会阻碍/延迟它被GC重新收集的能力,但实际上我对ObjectContext没有任何用处。
非常感谢。
答案 0 :(得分:0)
如果您需要将对象上下文作为参数与实体一起传递,那么您做错了。
通常只有在明确定义的层中才需要上下文。来自该层的所有类需要其逻辑上下文,可以通过一些专门的类 - 上下文提供程序(它也可以称为服务定位器)来接收上下文。上下文提供程序将在某个存储中保存当前上下文实例 - 您可以创建自己的上下文实例,也可以按照每个线程,每个http请求等存储它。
如果他们在您的课程中需要多个上下文实例,您可以修改您的提供者以便在工厂工作。
另一种常见方法是依赖注入。您将通过构造函数(或属性)将上下文传递给您的类,并且您将拥有一些bootstraper代码,它将为您执行所有必要的初始化(创建所需的实例并将所有依赖项传递给它们)。您可以再次传递上下文或工厂。这通常与IoC容器一起使用,它将为您进行管道连接。
准备好此基础结构后,您可以将实体传递给该层中的任何已初始化的类,并且它将具有上下文可用。