2013-04-08 57 views
1

我在Azure中創建了一個數據庫,用於設置我自己的自定義名稱。然後我創建了EF 5代碼的第一個實體並添加了遷移。在應用程序啓動我稱爲以下兩行:EF 5 + Azure + MigrationFirst覆蓋數據庫名稱。爲什麼?

 Database.DefaultConnectionFactory = new SqlConnectionFactory(connectionString); 
     Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDataContext, MyConfiguration>()); 

連接字符串直取自天青: 服務器= TCP:xxx.database.windows.net,1433;數據庫= DBNAME;用戶ID = YYY;密碼= zzz; Trusted_Connection = False;加密= True;連接超時= 30;

在第一次電話會議上,我期望數據庫dbName根據POCO模式填充表格。 而是一個具有我的上下文的完整的命名空間的名稱生成一個新的數據庫: MyService.Business.Entity.MyContext

爲什麼會遷移不接受連接字符串中指定的數據庫名稱?

+1

,如果你不如下面的Chris所示,不傳遞連接字符串EF將嘗試使用配置文件中的名稱與上下文名稱相同的連接字符串。如果沒有找到它,它將創建自己的連接字符串,其中將根據上下文名稱 – Pawel 2013-04-09 02:52:40

+0

創建數據庫名稱感謝您的解釋! – 2013-04-10 19:58:03

回答

1

您可以指定你的DbContext的構造函數的數據庫名稱或連接字符串名稱:

public class MyDataContext : DbContext 
{ 
    public MyDataContext: base("DbNameOrConntectionStringNameHere") 
    { 
    } 
} 
+0

奇怪的是,數據庫需要指定兩次才能使其工作,但至少它工作。謝謝! – 2013-04-10 20:00:06

+0

您不需要指定兩次。通常,我沒有爲連接工廠指定連接字符串,只是在標準的connectionStrings config部分中指定了一個連接字符串。 – 2013-04-10 20:50:10

1

我的經驗是,在連接字符串在代碼中傳遞而不是從app.config獲得的情況下,EF對於如何獲取連接字符串的做法很古怪。

我不得不補充說,從IDBContectFactory

public class ContextFactory : IDbContextFactory<Context> 
    { 
    public Context Create() 
    { 
     var s = (string)AppDomain.CurrentDomain.GetData("ConnectionString"); 
     var context = new Context(s); 

     return context; 
    } 
} 

而且繼承的類,以創建一個遷移,我需要在我的上下文類

// uncomment when creating migration - comment out after migration is created 
public Context() : base("ConnectionStringName"){} 

凡的connectionStringName設置如下在我的app.config。

我仍然感到迷惑,我不得不這樣做,並要求它here