2

我有問題,初始化數據到SQL Server精簡.sdf數據文件中的.NET Web應用程序。數據初始化如何工作?

我有一個數據初始化類。

namespace R10491.Models 
{ 
    public class SampleData : DropCreateDatabaseAlways<LibraryEntities> 
    { 
     protected override void Seed(LibraryEntities context) 
     { 
      var categories = new List<Category> 
      { 
       new Category{Id=1, Name="Sci-fi"} 
      }; 

     } 
    } 
} 

(用於測試目的,我使用的DropCreateDatabaseAlways代替DropCreateDatabaseIfModelChanges

這個初始化類我在Global.asax.cs文件稱:

protected void Session_Start() 
{ 
    System.Data.Entity.Database.SetInitializer(new R10491.Models.SampleData()); 
} 

(再次用於測試目的我把它列在每屆會議開始)。

我的連接字符串定義:

<connectionStrings> 
    <add name="LibraryEntities" 
    connectionString="Data Source=C:\Users\Administrator\Documents\Visual Studio 2012\Projects\2OBOP3_KU1\R10491\App_Data\R10491_library.sdf;" 
    providerName="System.Data.SqlServerCe.4.0"/> 
    </connectionStrings> 

但初始化不起作用 - 在SampleData類中定義的表沒有創造,也不能被數據進行初始化。

回答

2

看起來你忘了剛纔創建的Category添加到數據庫表。如果你不把它添加到context的表,Entity Framework就什麼也看不見......所以,你必須做這樣的事情:

protected override void Seed(LibraryEntities context) 
{ 
    var categories = new List<Category> 
    { 
     new Category{Id=1, Name="Sci-fi"} 
    }; 

    foreach(Category c in categories) 
    { 
     context.Categories.Add(c) 
    } 

    // Call the Save method in the Context 
    context.SaveChanges(); 
} 

爲數據源的問題,試試這個修改的連接字符串:

<add name="LibraryEntities" 
    connectionString="DataSource=|DataDirectory|R10491_library.sdf" 
    providerName="System.Data.SqlServerCe.4.0" /> 

在我的項目之一,我有這樣的連接字符串:

<add name="FitnessCenterContext" 
    connectionString="DataSource=|DataDirectory|FitnessCenter.Model.FitnessCenterContext.sdf" 
    providerName="System.Data.SqlServerCe.4.0" /> 

注意上面的數據庫名稱匹配命名空間和上下文名稱。


我也用Application_Start()調用SetInitializer方法Global.asax.cs文件。我看到你在Session_Start()之內調用它。也許這就是問題...你的代碼更改爲:

protected void Application_Start() 
{ 
    System.Data.Entity.Database.SetInitializer(new R10491.Models.SampleData()); 
} 

您也可以嘗試調用Initialize方法:

protected void Application_Start() 
{ 
    System.Data.Entity.Database.SetInitializer(new R10491.Models.SampleData()); 

    using (var context = new LibraryEntities()) 
    { 
     context.Database.Initialize(true); 
    } 
} 
+0

是的,我錯過了,謝謝。但還有另外一個問題。當我刪除.sdf文件並運行我的應用程序不會創建。自衛隊數據文件,是應該的,不是嗎?這與我的原始問題有關,這個初始化過程如何工作。 – Artegon

+1

是的......它應該在您重新啓動應用程序後自動創建,它會檢測到'.sdf'不再存在。通常這個文件是在'\ App_Data'文件夾中創建的。 –

+0

但在我的情況下,不創建'.sdf'文件。是否有必要進行修改或像它這樣的想法?問題應該在哪裏?感謝您的任何建議,我搜索了一個小時,我不知道問題出在哪裏。也許是我的ConnectionString的問題 - 我定義文件位置爲完整路徑(許多教程使用另一種語法)。 – Artegon