2011-08-11 35 views
0

我已經使用EF 4.1和DB第一種方法創建了一個新的MVC 3網站。我創建了edmx文件,然後創建了DBContext(新的4.1特性)類。一切順利。使用Database First方法後,實體框架4.1將無法連接到SQL Server

然後,我使用DBContext的自動創建功能創建了新的控制器。一切都不會很好。

現在,我試圖啓動網站,它不會連接到自己創建的連接字符串。

這裏是連接字符串:

<add name="PizzaByMeEntities" 
    connectionString='metadata=res://*/Models.PizzaByMeModel.csdl| 
           res://*/Models.PizzaByMeModel.ssdl| 
           res://*/Models.PizzaByMeModel.msl; 
         provider=System.Data.SqlClient; 
         provider connection string="data source=(local); 
                initial catalog=PizzaByMe; 
                integrated security=True; 
                pooling=False; 
                multipleactiveresultsets=True; 
                App=EntityFramework;"' 
    providerName="System.Data.EntityClient" /> 

當我火起來的網站,我得到:

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: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)

奇怪的是,如果我刪除的連接字符串 - 我仍然得到確切同樣的錯誤。我猜EF即使在那裏也找不到連接字符串。

任何想法?

謝謝!

編輯:

我的DbContext如下:

public partial class PizzaByMeEntities : DbContext 
{ 
    public PizzaByMeEntities() 
     : base("name=PizzaByMeEntities") 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     throw new UnintentionalCodeFirstException(); 
    } 

    public DbSet<X> Xs{ get; set; } 
    public DbSet<Y> Ys{ get; set; } 
    public DbSet<Z> Zs{ get; set; } 
} 

編輯2:

工作連接字符串是這樣的:

<add name="PizzaByMe" connectionString="Data Source=(local);initial catalog=PizzaByMe;integrated security=True;pooling=False;multipleactiveresultsets=True;" providerName="System.Data.EntityClient" /> 

雖然,使其工作 - 我只是使用直接的ADO.NET連接。

+0

我建議你第一件事是驗證此連接字符串是確定的(提供連接字符串,而不是整個實體之一)。也許將它轉儲到簡單的SqlConnection/SqlCommand/SqlDataReader周圍的測試頁面或應用程序中,然後查看它是否連接。如果沒有,那麼你的問題就在那裏。如果沒關係,那麼至少你知道問題出在EF或你的代碼上,而不是你的數據庫連接字符串。 –

+0

我檢查了它 - 工作得很好。 – Roman

+0

您運行的是哪個版本的SQL Server? – itsmatt

回答

3

你派生的DbContext類必須具有相同的名稱作爲連接字符串,如果你只執行了默認的構造函數(或者沒有構造全部)

public PizzaByMeEntities : DbContext 
{ 
    public PizzaByMeEntities() 
    { 
     // ... 
    } 
} 

如果你的背景有另一個名字,那麼你必須指定在構造連接字符串名稱:

public PizzaByMeContext : DbContext 
{ 
    public PizzaByMeContext() : 
     base("name=PizzaByMeEntities") 
    { 
     // ... 
    } 
} 

以下是有關連接和連接字符串的細節與DbContexthttp://blogs.msdn.com/b/adonet/archive/2011/01/27/using-dbcontext-in-ef-feature-ctp5-part-2-connections-and-models.aspx

編輯:另一種猜測

連接字符串必須在你的MVC應用程序的web.config,而不是在一個類庫項目,你可能有你的EF模型和的DbContext的app.config。是嗎?

+0

這正是我所擁有的:)仍然不起作用... – Roman

+0

@roman:您的解決方案中是否有單獨項目(類庫?)中的EF模型和上下文?如果是的話,你是否將連接字符串複製到你的MVC應用程序的web.config中? – Slauma

+0

不,他們都在同一個項目中,所以他們共享連接字符串。 – Roman

0

Phewwww ....想通了!

控制器創建的Context對象(當您使用新的上下文時)它創建的對象沒有選擇連接字符串的構造函數。所以它試圖使用一些不存在的連接字符串。

爲了得出結論 - 從DBContext派生的任何對象都應使用指定連接字符串的構造函數。

謝謝你們幫助我了:))

+1

咦?那麼,在你的上下文中是否有第二個構造函數需要一個或多個參數? DbContext生成器是創建它還是您手動編寫它? – Slauma

相關問題