【问题标题】:How data initialization works?数据初始化如何工作?
【发布时间】:2012-12-31 16:01:20
【问题描述】:

我在将数据初始化到 .NET Web 应用程序中的 SQL Server Compact .sdf 数据文件时遇到问题。

我有一个数据初始化类。

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 类中定义的表没有被创建,数据也没有被初始化。

【问题讨论】:

    标签: asp.net-mvc entity-framework initialization sql-server-ce seeding


    【解决方案1】:

    您似乎忘记将刚刚创建的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() 来调用Global.asax.cs 文件中的SetInitializer 方法。我看到你在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);
         }
    }
    

    【讨论】:

    • 是的,我错过了,谢谢。但是还有另一个问题。当我删除 .sdf 文件并运行我的应用程序时,不会创建 .sdf 数据文件并且应该是,不是吗?它与我最初的问题有关,这个初始化过程是如何工作的。
    • 是的......它应该在您重新启动应用程序后自动创建,并且它检测到 .sdf 不再存在。通常,此文件是在 \App_Data 文件夹中创建的。
    • 但在我的情况下,.sdf 文件没有创建。是否有必要提交更改或类似的想法?应该是哪里出了问题?感谢您的任何建议,我用谷歌搜索了一个小时,但我不知道问题出在哪里。也许是我的 ConnectionString 的问题 - 我将文件位置定义为完整路径(许多教程使用另一种语法)。
    • 我在上面的问题中提到了连接字符串。
    • 我的上下文类 FitnessCenterContext 在命名空间 FitnessCenter.Model 内。这是我使用的一个单独的类库。如果您不熟悉命名空间,请查看:msdn.microsoft.com/en-us/library/0d941h9d.aspx。您能告诉我您使用的是什么:SQL Server Express、LocalDB 等...来存储数据。您是否尝试将代码放入 Application_Start() 而不是 Session_Start()
    猜你喜欢
    • 2018-12-07
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 2020-10-29
    相关资源
    最近更新 更多