entity-framework – 使用Unity注册EF4 ObjectContext的正确方法?

我在Unity中使用EF4 ObjectContext时遇到问题.具体来说,当Unity尝试使用以下代码解析我的ObjectContext时:

container.RegisterType<ObjectContext, MyObjectContext>(
    new TransientLifetimeManager(), new InjectionConstructor());

它给了我:

The specified named connection is either not found in the configuration, not intended to be used with the EntityClient provider, or not valid.

我假设它能够使用在创建EF4数据模型时设置的硬连线连接(与无参数构造函数一起使用),但似乎我必须明确地传递它:

container.RegisterType<ObjectContext, MyObjectContext>(
    new TransientLifetimeManager(), new InjectionConstructor(connectionString));

此外,由于这个方法似乎创建了我的(一次性)ObjectContext的实例,什么时候才能销毁它?

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

提前致谢.

最佳答案 例外情况“在配置中找不到指定的命名连接,不打算与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
}
点赞