27

我使用的多層項目中,數據模型承載ADo.NET實體模型和數據訪問層做驗證。ADO.NET實體連接字符串多個項目

但是每次我得到這樣

指定命名的連接或者未在配置中找到一個錯誤,不打算與EntityClient提供者,或者不是有效的使用。

我試圖連接字符串

<add name="SalesEntities" connectionString="metadata=res://*/SalesEntities.csdl|res://*/SalesEntities.ssdl|res://*/SalesEntities.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

<add name="SalesEntities" connectionString="metadata=.\SalesEntities.csdl|.\SalesEntities.ssdl|.\SalesEntities.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

也嘗試過其他的組合,是指被叫項目目錄,但沒有運氣的根目錄。

任何幫助,高度讚賞。非常感謝,一如既往:)。

回答

25

你必須把那些連接字符串中的每個應用程序的app.config文件。如果您有一個您生成模型的DAL,然後嘗試在EXE中使用DAL,則會發生同樣的情況。 EXE不知道連接字符串。

我發現的最簡單的方法是在每個項目上放置一個app.config,並從DAL中複製連接字符串,然後在最初生成模型。然後每個將有一個相同的連接字符串的副本。

+3

HM,是它在某種程度上可以存儲在一個地方所有的連接字符串,然後「告訴」給所有的Web.config文件在哪裏可以找到連接字符串? – Tony 2010-10-21 19:10:18

0

我添加了同樣的問題,試圖單元測試我DAL。我發現這工作:

<add name="SalesEntities" connectionString="metadata=res://*;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 
0

我有一個WinForms項目有類似的問題,儘管亂投醫,直到我刪除了我能找到與之相關的網頁上解決不了我的問題.....從我的BaseForm到我使用ObjectContext(私有CubEntities _oc = new CubEntities())的字段,以及使用它的實際表單。

2

如果您複製App.Config文件到主項目,並與正常'字符替換所有&quot;它應該運行

1

我通過了entityconnectionstring到ObjectContext的類的所有實例和它現在的工作。

但其開銷太大,創建具有的ConnectionString屬性,並把它當作參數傳遞給每個實例

2

我建議在上面給出的建議有輕微的變化。

這不是一個巨大的進步,但至少它給你的關注一些分離。

當EF嚮導創建.edmx文件及其關聯的.Designer .cs文件時,C#代碼將聲明一個部分類。因此,您可以簡單地將另一個.cs文件添加到包含兩個EDM文件的項目中。

這個新的文件定義了相同的命名空間和類的附加靜電功能。

這個新的靜態函數將返回所需的類型(ObjectContext中的後裔)的一個實例。

新的文件是一個單獨的文件,所以它不會被覆蓋,如果你重新創建的.edmx和了.Designer.cs。

您複製並粘貼在EDM項目,這是怎樣的一個黑客攻擊的的.config連接字符串,但至少它讓隱藏在EDM項目的連接字符串。

新的文件看起來是這樣的:

namespace MyNamespace 
{ 
    public partial class MyEntities : ObjectContext 
    { 
    public static MyEntities New_MyEntities() 
    { 
     string connStr; 
     MyEntities theContext; 

     connStr = "metadata=res://*/MyClass.csdl|res://*/MyClass.ssdl|res://*/MyClass.msl;provider=System.Data.SqlClient;provider connection string=\"Data Source=localhost\\SQLSERVER;Initial Catalog=MyDb;Integrated Security=True;MultipleActiveResultSets=True\""; 
     // set the connection string 

     theContext = new MyEntities(connStr); 
     // allocate it 

     return theContext; 
     // return it 
    } 
    } 
} 

要獲得一個新的實體對象,您只需撥打您的電話工程靜態函數New_MyEntities()。

0

我有同樣的問題,我&嘗試所有提到的方法。最後我解決了它,如上所述。在我的情況下,我有單獨的數據層和表示層。在我的app.config(數據層),我有這樣的連接。

<add name="LibraryMgtSysEntities" connectionString="metadata=res://*/DataLibraryMgtSys.csdl|res://*/DataLibraryMgtSys.ssdl|res://*/DataLibraryMgtSys.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=abc;initial catalog=LibraryMgtSys;Persist Security Info=True;user id=sa;password=123;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 

在我web.config我手動配置連接如下:

<add name="DefaultConnection" providerName="System.Data.SqlClient" 
connectionString="Data Source=abc; 
Initial Catalog=LibraryMgtSys; 
Integrated Security=SSPI; 
user id=sa;password=123;" /> 

它給我相同的異常如上所述。所以我通過在web配置文件中添加app.config值來解決它。

我最後web.config文件,如下所示:

<connectionStrings> 
    <clear /> 
    <add name="LibraryMgtSysEntities" connectionString="metadata=res://*/DataLibraryMgtSys.csdl|res://*/DataLibraryMgtSys.ssdl|res://*/DataLibraryMgtSys.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=TILANITHOTAMUNE\SQLEXPRESS;initial catalog=LibraryMgtSys;Persist Security Info=True;user id=sa;password=testing;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 
    <add name="DefaultConnection" providerName="System.Data.SqlClient" 
     connectionString="Data Source=abc; 
     Initial Catalog=LibraryMgtSys; 
     Integrated Security=SSPI; 
     user id=sa;password=123;" /> 
    </connectionStrings> 
0

我有問題在我的項目之一,是要求一個工作,一個Web應用程序和測試項目實體框架的連接字符串。要解決這個問題的方法之一是以下幾點:

1)使用的UnitOfWork(或類似)的模式。這允許控制數據上下文的創建和操縱連接字符串

public partial class MyContext 
{ 
    #region Members 
    private static readonly object objSync = new object(); 
    private static readonly string DATACONTEXT_KEY = "MyContext_UserInstance"; 
    // TODO: read from a place accesible to all deployed projects 
    // remove hardcoded database 
    private static readonly string DefaultConnectionString = @"metadata=res://*/MyContext.csdl|res://*/MyContext.ssdl|res://*/MyContext.msl;provider=System.Data.SqlClient;provider connection string='data source=Server;initial catalog=MyDatabase;integrated security=True;multipleactiveresultsets=True;App=EntityFramework'"; 

    private static string connectionString; 
    #endregion 

    public MyContext(String connectionString) : base(connectionString) 
    { 
    } 

    /// <summary> 
    /// Uses a UnitOfWorkStore to return the same instance of MyContext, that is unique 
    /// per user, per postback (or CallContext, if not in an HttpContext environment, such as unit tests or console apps) 
    /// </summary> 
    public static MyContext Instance 
    { 
     get 
     { 
      // Dirty (non thread-safe) check 
      if (UnitOfWorkStore.GetData(DATACONTEXT_KEY) == null) 
      { 
       lock (objSync) 
       { 
        // Thread-safe check 
        if (UnitOfWorkStore.GetData(DATACONTEXT_KEY) == null) 
        { 
         MyContext context = new MyContext(DefaultConnectionString); 
         connectionString = context.Database.Connection.ConnectionString; 
         UnitOfWorkStore.SetData(DATACONTEXT_KEY, context); 
        } 
       } 
      } 
      return (MyContext)UnitOfWorkStore.GetData(DATACONTEXT_KEY); 
     } 
    } 

} 
  • 數據上下文應該允許直接連接字符串輸入:

    公共MyContext(字符串的connectionString):基座(的connectionString) {}