2012-05-28 28 views
2

我有與SqlServerCe.3.5連接實體框架的問題。 我有一個名爲Assets with .SDF數據庫和實體的小項目(模型名稱爲Main)。 現在,當我試圖連接到實體發生了一些奇怪的事情。 在第一時間一切工作正常,但現在我有一定要加入這個:c# - 實體框架與SqlServerCe.3.5 - 連接異常

if (edmConnection.State != ConnectionState.Open) 
    { 
    edmConnection.Open(); 
    } 

,因爲所有的時間到實體連接被關閉。 i之後加入此線,我可以達到數據庫和實體,但我得到這樣的信息:

指定命名的連接或者未在配置中發現的,而不是意在與EntityClient提供者可以使用,或無效。

這是堆棧跟蹤:

在System.Data.EntityClient.EntityConnection.ChangeConnectionString(字符串newConnectionString) 在System.Data.EntityClient.EntityConnection..ctor(字符串的connectionString) 在System.Data.Objects.ObjectContext.CreateEntityConnection(String connectionString) at System.Data.Objects.ObjectContext ..ctor(String connectionString,String defaultContainerName) at BL.Model.DBEntities..ctor()in C:\ Users \ Orel \ Documents \ Visual Studio 2010 \ Projects \ Assets \ BL \ Model \ Main.Designer.cs:line 34 0 ()中的BL.Handlers.mModelHandler..ctor() (位於C:\ Users \ Orel \ Documents \ 30

這是我的代碼,並在app.config:

private static mModelHandler _mInstance = null; 
public static DBEntities m_context = null; 


public static mModelHandler GetOnlyInstance() 
{ 
    if (_mInstance == null) 
    { 
     try 
     { 
      m_context = new DBEntities(GetConnectionString()); 
      _mInstance = new mModelHandler(); 
     } 
     catch (Exception) 
     { 


      throw; 
     } 

    } 
    return _mInstance; 
} 

public static EntityConnection GetConnectionString() 
{ 
    try 
    { 
     var filePath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); 
     if (filePath == null) throw new ArgumentNullException("filePath"); 

     if (filePath.EndsWith("\\Assets\\bin\\Debug")) 
     { 
      filePath = filePath.Replace("\\Assets\\bin\\Debug", "\\BL\\DB.sdf"); 
     } 
     var sqlCeConnectionString = string.Format("Data Source={0}", filePath); 

     // Create an EDM connection 
     EntityConnectionStringBuilder entity = new EntityConnectionStringBuilder(); 

     entity.Metadata = "res://*/Model.Main.csdl|res://*/Model.Main.ssdl|res://*/Model.Main.msl"; 
     entity.Provider = "System.Data.SqlServerCe.3.5"; 
     entity.ProviderConnectionString = sqlCeConnectionString; 

     var edmConnectionString = entity.ToString(); 
     var edmConnection = new EntityConnection(edmConnectionString); 
     if (edmConnection.State != ConnectionState.Open) 
     { 
      edmConnection.Open(); 
     } 
     return edmConnection; 
    } 
    catch (Exception e) 
    { 

     throw; 
    } 
} 

在app.config:

<add name="DBEntities" connectionString="metadata=res://*/Model.Main.csdl|res://*/Model.Main.ssdl|res://*/Model.Main.msl;provider=System.Data.SqlServerCe.3.5;provider connection string='Data Source=|DataDirectory|\DB.sdf'" providerName="System.Data.EntityClient" /> 

我在4米閱讀,問題可以是應用程序。配置和連接字符串a再無法比擬的,我想這也和它這麼想的工作..

我只是說了這樣一個形象: Link

幫助!

Orel

+0

難道你不能使用EF設計師自動生成的配置/連接字符串嗎? –

+0

我使用了自動生成的配置/連接,我的問題是在代碼不在app.config –

回答

0

我想你的連接字符串沒有被正確解析。嘗試使用&quot;代替'

我也認爲,對於SqlCE,provider以內的報價應該是provider=System.Data.SqlServerCe,3.5;而不是provider=System.Data.SqlServerCe.3.5;

請注意版本3.5之前的,

全部放在一起,我們有:

<add name="DBEntities" 
    connectionString="metadata=res://*/Model.Main.csdl|res://*/Model.Main.ssdl|res://*/Model.Main.msl;provider=System.Data.SqlServerCe,3.5;provider connection string= &quot;Data Source=|DataDirectory|\DB.sdf&quot;" 
    providerName="System.Data.EntityClient" /> 

希望這有助於。

+0

不,這不是幫助。我試過這個,但得到注意,在函數** Getconnection **有行: entity.Provider =「System.Data.SqlServerCe.3.5」; 我試圖將這也改爲: entity.Provider =「System.Data.SqlServerCe,3.5」 ,我得到了另一個執行 –

+0

什麼是例外?而且,我使用自定義代碼來讀取app.config值似乎很奇怪。選擇讓您的.edmx文件在app.config中使用自動生成的連接字符串,或者在代碼中明確指定連接。不要這樣做 - 這可能是你的問題的根本原因 –