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到数据库表中。如果您不将其添加到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" />

在我的一个项目中,我有这个连接字符串:

<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);
     }
}
于 2012-12-31T16:12:25.737 回答