使用Unity注册EF4 ObjectContext的正确方法?

时间:2011-02-13 06:47:54

标签: entity-framework unity-container

我在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的实例,什么时候才能销毁它呢?

或者,我应该完全不同地做这件事吗?

提前致谢。

1 个答案:

答案 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
}