实体框架4 -在生成的实体中嵌入ObjectContext引用
本文关键字:实体 引用 ObjectContext 框架 | 更新日期: 2023-09-27 18:06:10
我是实体框架4.0的新手,将其与c#一起使用,目前正在试验其功能。
我注意到的是,与大多数类似的orm一样,它依赖于一个Context对象来处理在生成的实体上完成的数据操作和CRUD语句生成。
这意味着如果我想将更改保存回数据库,我总是需要能够访问对实例化实体的ObjectContext的引用。
如果上下文是在一个可访问的范围内创建的(例如,相同的方法),那就很好了,但是如果我将一个实体或实体集传递给一个方法,并希望这个方法保存更改,该怎么办?看起来唯一简单的方法是将ObjectContext与参数一起传递。
另一个解决方案是将ObjectContext放在某种全局变量中。不用说,我发现这两种方法都存在样式和可维护性问题。
简而言之,我能想到的最好的方法是从实体或实体集获得对ObjectContext的引用。我知道默认情况下这是不可能的。
我发现了一个方法,显示添加一个扩展方法来从实体中获取ObjectContext。然而,它只适用于有关系的实体,并且根据作者的说法,调用这个方法是昂贵的。
我正在考虑修改T4模板,为我的所有实体添加一个Context属性,并在实体的实例化上自动填充它。
我已经修改了T4模板一次有实体框架强制最大长度对我生成的类(通过遵循朱莉·勒曼的编程实体框架4书)。到目前为止,我不能说我真的很喜欢T4语法,但如果这是最好的/唯一的方法,那就这样吧……
有没有人已经这样做了,处理这个问题的最好方法是什么,并愿意分享他的T4模板或解释什么是最好的部分方法或事件来完成这个工作?
使用这种方法有什么主要的缺点吗?我在想,如果我的一些实体仍然在作用域中,那么对ObjectContext有如此多的引用可能会阻碍/延迟其被GC回收的能力,但我实际上已经不再使用ObjectContext了。
许多谢谢。如果您需要将对象上下文作为参数与您的实体一起传递,则您正在做一些错误的事情。
通常上下文只需要在定义良好的层中。这一层的所有需要上下文的类都可以通过一些专门的类——上下文提供程序(也可以称为服务定位器)来接收上下文。上下文提供程序将在一些存储中保存当前上下文实例——你可以创建自己的,也可以每个线程、每个http请求等存储它。
如果你的类中需要不止一个上下文实例,你可以修改你的provider,让它也像工厂一样工作。
另一种常见的方法是与依赖注入相结合。你将通过构造函数(或属性)将上下文传递给你的类,你将有一些引导程序代码,这些代码将为你做所有必要的初始化(创建所需的实例并将所有依赖项传递给它们)。同样,您可以传递上下文或工厂。这通常与IoC容器一起使用,IoC容器将为您完成管道工作。
一旦你准备好了这个基础结构,你就可以将你的实体传递给该层的任何初始化的类,它将具有可用的上下文。