2

.sdf.NET Web アプリケーションでSQL Server Compact データ ファイルにデータを初期化する際に問題があります。

データ初期化クラスがあります。

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は作成されず、データも初期化されません。

4

1 に答える 1

2

作成Categoryしたばかりを DB テーブルに追加するのを忘れているようです。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();  
}

DataSource の問題については、次の変更された接続文字列を試してください。

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

私のプロジェクトの 1 つに、次の接続文字列があります。

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

上記のデータベース名は名前空間とコンテキスト名と一致することに注意してください。


また、ファイル内のメソッドApplication_Start()を呼び出すために使用します。内部で呼び出していることがわかります。たぶんこれが問題です...コードを次のように変更します。SetInitializerGlobal.asax.csSession_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);
     }
}
于 2012-12-31T16:12:25.737 に答える