2011-08-30 116 views
3

對於ASP.NET MVC 3來說,這是相當新的,並且對於一般的編碼來說確實如此。MVC 3 EF Code-first to webhost database trouble

我有一個非常小的應用程序,我想上傳到我的虛擬主機域。

我正在使用實體框架,它在我的本地機器上正常工作。 我輸入了一個新的連接字符串來替代我的遠程數據庫,但是它並沒有真正起作用,首先我有一個MSSQL數據庫,它不能被刪除和重新創建,所以我不能在我的初始化程序中使用該策略,我試圖在策略中提供null,但無濟於事,我的表根本不會在我的數據庫中創建,那就是問題所在,我不知道如何使用實體框架來做到這一點。

當我運行應用程序,它試圖從數據庫中選擇數據,該部分工作正常,我只是不知道如何能夠通過codefirst在我的數據庫中創建這些tabes。

我可以通過手動重新創建表格來獲得它的工作,但我想通過codefirst知道解決方案。

這是我的初始化類

public class EntityInit : DropCreateDatabaseIfModelChanges<NewsContext> 
{ 
    private NewsContext _db = new NewsContext(); 


    protected override void Seed(NewsContext context) 
    { 
     new List<News> 
     { 
      new News{ Author="Michael Brandt", Title="Test News 1 ", NewsBody="Bblablabalblaaaaa1" }, 
      new News{ Author="Michael Brandt", Title="Test News 2 ", NewsBody="Bblablabalblaaaaa2" }, 
      new News{ Author="Michael Brandt", Title="Test News 3 ", NewsBody="Bblablabalblaaaaa3" }, 
      new News{ Author="Michael Brandt", Title="Test News 4 ", NewsBody="Bblablabalblaaaaa4" }, 
     }.ForEach(a => context.News.Add(a)); 


     base.Seed(context); 
    } 
} 

正如我所說的,我真的新的這一切,所以原諒我,如果即時通訊缺乏提供您所需要回答我的問題的正確的信息,只是我知道,我會回答它

回答

0

如果你使用的是一個非常小的應用程序,你可能會去SQL CE 4.0。
即使您的提供程序沒有爲其安裝二進制文件,bin部署也應該允許您運行SQL CE 4.0。你可以read more here

我們可以真正使用任何你想要的初始化工具,因爲你現在沒有不能刪除數據庫和刪除表的問題。

可能 this有什麼幫助嗎?

+0

hmm現在意識到最新版本是爲CTP5完成的,所以它可能會被破壞。無論如何,我可能會自己檢查一下,謝謝! :) –

+0

謝謝!但是,它會嘗試刪除我的數據庫中的所有當前表?我不能也不能承受,我該如何解決這個問題? – Paragonbliss

+0

我有點太快了,對不起。誤導部分名稱「JustCreateTables」... 如果你不能刪除表,那麼沒有太多的使用腳本,我猜,如果目的是更新已經存在的表。 –

2

初始化策略目前不支持升級策略。

初始化策略應該用來初始化一個新的數據庫。所有後續更改應該使用腳本來完成。

我們所說的最佳做法是用腳本修改數據庫,然後手動調整代碼以反映此更改。

在未來的版本中,升級/遷移策略將可用。


試圖通過聲明從定製IDatabaseInitializer 執行腳本語句,然後從這個你可以讀取數據庫的數據庫版本和應用缺少的腳本到你的數據庫。只需將一個數據庫版本存儲在一個表中。然後升級更改腳本。

public class Initializer : IDatabaseInitializer<MyContext> 
     { 
      public void InitializeDatabase(MyContext context) 
      { 
       if (!context.Database.Exists() || !context.Database.CompatibleWithModel(false)) 
       { 
        context.Database.Delete(); 
        context.Database.Create(); 
        var jobInstanceStateList = EnumExtensions.ConvertEnumToDictionary<JobInstanceStateEnum>().ToList(); 
        jobInstanceStateList.ForEach(kvp => context.JobInstanceStateLookup.Add(
         new JobInstanceStateLookup() 
          { 
           JobInstanceStateLookupId = kvp.Value, 
           Value = kvp.Key 
          })); 

        context.SaveChanges(); 
       }   
      } 
     } 

您是否嘗試過使用CreateDatabaseOnlyIfNotExists

- 每個上下文進行初始化時,將數據庫,如果它不存在重新創建。

可以使用Database類的SetInitializer方法設置數據庫初始值設定項。如果沒有指定它,它將使用CreateDatabaseOnlyIfNotExists類來初始化數據庫。

Database.SetInitializer(null); 

-

Database.SetInitializer<NewsContext>(new CreateDatabaseOnlyIfNotExists<NewsContext>()); 

我不知道這是因爲我還沒有在一段時間寫了這個確切的語法。但它應該非常相似。

+0

我想它的工作原理是它創建數據庫,但它仍然不創建表,但它只是向前移動以嘗試查詢我的控制器中的數據庫 – Paragonbliss

+0

如果您的配置是正確的,那麼這將創建表 –

+0

是否有你正在考慮的任何奇怪的配置,所以我可以告訴你。我很抱歉,正如我所說,即時通訊對此仍然非常陌生,所以它仍然讓我感到困惑,所以我仍然錯誤地認識了很多事情。 – Paragonbliss