我在Unity中遇到EF4 ObjectContext问题。具体来说,当Unity尝试使用以下代码解析我的ObjectContext时:
container.RegisterType<ObjectContext, MyObjectContext>(
new TransientLifetimeManager(), new InjectionConstructor());
它给了我:
在配置中找不到指定的命名连接,不打算与EntityClient提供程序一起使用,或者无效。
我认为它可以使用在创建EF4数据模型时设置的硬连线连接(与无参数构造函数一起使用),但似乎我必须明确地传递它:
container.RegisterType<ObjectContext, MyObjectContext>(
new TransientLifetimeManager(), new InjectionConstructor(connectionString));
另外,由于这个方法似乎创建了我的(一次性)ObjectContext的实例,什么时候才能销毁它呢?
或者,我应该完全不同地做这件事吗?
提前致谢。
答案 0 :(得分:2)
异常“在配置中找不到指定的命名连接,不打算与EntityClient提供程序一起使用,或者无效。”显然不是注册类型解析失败的结果,但它是EF异常。
EF设计师应该用这样的构造函数创建一个上下文:
public MyObjectContext() : base("name=MyObjectContext", "MyObjectContext")
{
...
}
并在app.config / web.config中添加了一个连接字符串。假设设计者没有做错,我会排除这个“命名连接”“不打算与EntityClient提供者一起使用,或者无效”。仍然是“命名连接”“在配置中找不到”。
您是否检查过连接字符串是否位于解析ObjectContext 的项目的app.config / web.config 中?例如,如果您将EF模型放在单独的类库中,则EF会在该项目中使用正确的连接字符串创建app.config。如果您从另一个引用EF类库的项目中使用此模型,则需要手动将连接字符串复制到此项目的app.config / web.config。 EF不会查看类库的配置。
关于你的问题,什么是销毁ObjectContext的正确位置,最常见的答案是:“当你不再需要它时”。在不了解项目背景的情况下提供建议很困难。如果你需要的数据访问是一种方法,我想你可以写:
using (var context = container.Resolve<ObjectContext>())
{
// your EF operations
}