2011-01-26 77 views
63

如何將連接字符串傳遞給實體框架的代碼優先DbContext?如果DbContext和web.config中的連接字符串位於同一個項目中並且命名方式相同,則我的數據庫生成工作正常。但現在我需要到的DbContext移動到另一個項目,所以我測試通過連接字符串,如下所示:將連接字符串傳遞給代碼優先DbContext

型號&語境

public class Dinner 
{ 
    public int DinnerId { get; set; } 
    public string Title { get; set; } 
} 

public class NerdDinners : DbContext 
{ 
    public NerdDinners(string connString) 
     : base(connString) 
    { 
    } 
    public DbSet<Dinner> Dinners { get; set; } 
} 

行動

public ActionResult Index() 
    { 
     var db = new NerdDinners(ConfigurationManager.ConnectionStrings["NerdDinnerDb"].ConnectionString); 

     var dinners = (from d in db.Dinners 
         select d).ToList(); 
     return View(dinners); 
    } 

的Web.Config

<connectionStrings> 
    <add name="NerdDinnerDb" connectionString="Data Source=|DataDirectory|NerdDinners.sdf" providerName="System.Data.SqlServerCe.4.0"/>  
</connectionStrings> 

如果我在操作中設置斷點並分析db,那麼連接字符串就在那裏,但它不會創建或查找數據庫或任何東西。

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

+0

你確定你連接到正確的服務器?該錯誤是典型的SQL Server/Express異常。聽起來不像是你連接到Sql CE數據庫......並且EF代碼首先會創建數據庫,如果它不存在的話...除非路徑找不到或許...... – 2011-01-26 14:57:15

回答

54

閱讀文檔後,我必須通過連接字符串的名稱,而不是:

var db = new NerdDinners("NerdDinnerDb"); 
+0

我把它放在我的構造函數中,並將其作爲公有常量以防其他地方需要引用。 – 2013-02-19 00:41:22

1

檢查web.config中連接字符串的語法。它應該是類似於ConnectionString="Data Source=C:\DataDictionary\NerdDinner.sdf"

+0

連接字符串工作時他們在同一個項目中使用相同的名稱。 – 2011-01-26 13:44:20

+0

當我想手動將它傳遞給DbConext時它不起作用 – 2011-01-26 13:44:41

+0

連接字符串很好,路徑不需要是絕對的。 – 2011-01-26 14:29:11

1

當使用EF模型時,我在每個項目中都有一個連接字符串,它使用EF模型。例如,我在一個單獨的類庫中有一個EF EDMX模型。我的web(mvc)項目中有一個連接字符串,以便它可以訪問EF數據庫。

我也有一個測試庫的另一個單元測試項目。爲了使存儲庫訪問EF數據庫,測試項目的app.config文件具有相同的連接字符串。

DB連接應配置,不進行編碼,IMO。

+2

我需要通過代碼手動傳遞連接字符串。我正在使用依賴注入。 – 2011-01-26 13:45:48

0

看不出你的代碼有什麼問題,我使用SqlExpress,並且在構造函數中使用連接字符串時它工作正常。

你已經在你的項目中創建了一個App_Data文件夾,不是嗎?

1

如果您正在構建的應用程序中的連接字符串,那麼你可以使用你的CONNSTRING的命令。如果您在Web配置中使用連接字符串。然後你使用該字符串的「名稱」。

36

以爲我會爲尋找「如何將連接字符串傳遞給DbContext」的人添加此位:您可以爲基礎數據存儲區構造連接字符串,並將整個連接字符串傳遞給您的構造函數從DbContext派生的類型。

(再使用代碼來自@Lol編碼器) 型號&語境

public class Dinner 
{ 
    public int DinnerId { get; set; } 
    public string Title { get; set; } 
} 

public class NerdDinners : DbContext 
{ 
    public NerdDinners(string connString) 
     : base(connString) 
    { 
    } 
    public DbSet<Dinner> Dinners { get; set; } 
} 

然後說你使用構造SQL連接字符串SqlConnectioStringBuilder像這樣:

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(GetConnectionString()); 

在哪裏GetConnectionString方法構造適當的連接字符串,SqlConnectionStringBuilder確保連接字符串在語法上是正確的;那麼你可以實例化你的數據庫conetxt像這樣:

var myContext = new NerdDinners(builder.ToString()); 
59

有點晚了這裏的比賽,但另一種選擇是:

public class NerdDinners : DbContext 
{ 
    public NerdDinners(string connString) 
    { 
     this.Database.Connection.ConnectionString = connString; 
    } 
    public DbSet<Dinner> Dinners { get; set; } 
} 
20

在你的DbContext,爲你的DbContext創建一個默認的構造函數和繼承這樣的基地:

public myDbContext() 
     : base("MyConnectionString") // connectionstring name define in your web.config 
    { 
    }