2011-02-13 46 views
4

我在Unity中遇到EF4 ObjectContext问题。具体而言,当团结试图解决我的ObjectContext用下面的代码:使用Unity注册EF4 ObjectContext的正确方法?

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

它给我:

指定命名的连接或者未在配置中发现的,不打算与使用EntityClient提供者,或无效。

我以为这将能够使用已创建EF4数据模型(带参数的构造函数使用)时设置的硬连线连接,但似乎我必须明确地传递这个在:

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

此外,由于此方法似乎创建我的(一次性)ObjectContext的实例,何时是适当的地方来销毁它?

或者,我应该完全不同吗?

在此先感谢。

回答

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 
} 
+0

感谢Slauma,我没有想过在我的EF项目中检查app.config。你是对的,它在那里。将该连接字符串复制到我的web.config文件中,可以让我将它恢复为无参数的构造函数。关于ObjectContext的处理,我需要深入探讨这个问题,并可能在另一个问题上提出这个问题。我使用了一些我发现的示例实现,并且在我确定最佳处置ObjectContext之前需要更好地理解它。 – 2011-02-14 04:01:26