2011-02-13 23 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