2011-06-01 169 views
2

從我讀過的所有東西,EntityFramework應該是蜜蜂膝蓋,你可以使用CodeFirst從POCO生成實體。真棒!我已經這樣做了,我讓EntityFramework的默認行爲完成了它的事情,現在我被困在牆背上。實體框架4.1 - 交換數據庫

我已經讀過關於EntityFramework和MVC3應用程序的一切,你可以在你的web.config中更改DBContext連接字符串,它應該自動感知,清除它已經緩存並重新生成的元數據,並且調用默認值種子或您的自定義種子方法。我不敢苟同。

我有一個非常簡單的數據庫上下文類:

namespace AwesomeApp.Models 
{ 
    public class MyContext : DbContext 
    { 
     public DbSet<Sneeze> Sneeze { get; set; } 
    } 
} 

已經花了幾個衝刺越來越到位的模式,與控制器和視圖的工作後,我準備好遷移到分段使用SQLServer Express 2008的環境。所以我問谷歌如何做到這一點,它明目張膽地指出,在這篇博客文章中,您將連接字符串設置爲實體上下文作爲名稱,其他所有內容都應該落實到位。

<connectionStrings> 
<add name="MyContext" 
    connectionString="Server=server;Database=awesome_sauce;User ID=noob;Password=noob;Trusted_Connection=False;" 
    providerName="System.Data.SqlClient"/> 

我要舉報,在我列出的數據庫它不是在創建表(S),並仍在訪問默認數據庫。這給我留下了2個問題,我敢肯定它得緊從我的無知

  1. 在哪裏默認數據庫位於SQL Server Express的(或者是CE)是實體框架默認調用?
  2. 當您更新連接時,程序員是否需要更多的交互來獲得交換數據庫的行爲?

回答

1

以下是我使用SQLite DB動態更改路徑的示例...對於任何SQL都可以採用相同的邏輯。我把這個在我的我的WPF應用程序的application.xaml(所以把概率在你的Application_Start)

' Application-level events, such as Startup, Exit, and DispatcherUnhandledException 
' can be handled in this file. 

Public Sub New() 

    'Attempt to load the db file 
    Dim dbFile As New IO.FileInfo(AppDomain.CurrentDomain.BaseDirectory & "Files\database.s3db") 

    'Loop till we get liteEntities 
    For Each item As System.Configuration.ConnectionStringSettings In ConfigurationManager.ConnectionStrings 
     If item.Name <> "liteEntities" Then Continue For 

     'Allow us to update this ite 
     Dim fi = GetType(ConfigurationElement).GetField("_bReadOnly", BindingFlags.Instance Or BindingFlags.NonPublic) 
     fi.SetValue(item, False) 

     'Update it 
     item.ConnectionString = Replace(item.ConnectionString, "C:\db\Files\database.s3db", dbFile.FullName) 

    Next 


End Sub 
+0

使用這個片段也暴露了一個有趣的連接字符串後:LocalSqlServer,並ApplicationServices - 僅有的兩個連接字符串這顯然正在使用。 - 我已將它們重置並仍然使用舊數據庫:| – lazyPower 2011-06-01 04:42:03

+3

是否嘗試清除默認連接' Eranga 2011-06-01 04:55:14

+0

這樣做的訣竅,爲我熬夜對這個項目進行黑客入侵提供了方便。謝謝Eranga – lazyPower 2011-06-01 06:25:03

1
// for a website: 
[assembly: System.Web.PreApplicationStartMethod(typeof (MyContextNS.MyContextInitializer), "Application_Start")] 
// or just call MyContextNS.MyContext.Application_Start(); before using MyContext 
namespace MyContextNS 
{ 
    public class MyContextInitializer 
     : DropCreateDatabaseAlways<MyContext> 
     // : DropCreateDatabaseIfModelChanges<MyContext> 
    { 
     public static void Application_Start() { 
      var initializer = new MyContextInitializer(); 
      Database.SetInitializer<MyContext>(initializer); 
     } 
     protected override void Seed(MyContext context) { 
      base.Seed(context); 
      // ... initialize 
     } 
    } 
}