首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据初始化是如何工作的?

数据初始化是如何工作的?
EN

Stack Overflow用户
提问于 2013-01-01 00:01:21
回答 1查看 2K关注 0票数 2

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

我有一个数据初始化类。

代码语言:javascript
复制
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文件中调用的这个初始化器类:

代码语言:javascript
复制
protected void Session_Start()
{
   System.Data.Entity.Database.SetInitializer(new R10491.Models.SampleData());
}

(同样,出于测试目的,我在每次会话启动时调用它)。

我的连接字符串定义:

代码语言:javascript
复制
  <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类中定义的表,也没有初始化数据。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-01 00:12:26

看起来您忘记了将刚刚创建的Category添加到DB表中。如果你不把它添加到context的表中,Entity Framework什么也看不到……所以你必须这样做:

代码语言:javascript
复制
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问题,请尝试以下修改后的连接字符串:

代码语言:javascript
复制
<add name="LibraryEntities"
     connectionString="DataSource=|DataDirectory|R10491_library.sdf"
     providerName="System.Data.SqlServerCe.4.0" />

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

代码语言:javascript
复制
<add name="FitnessCenterContext"
     connectionString="DataSource=|DataDirectory|FitnessCenter.Model.FitnessCenterContext.sdf"
     providerName="System.Data.SqlServerCe.4.0" />

请注意,上面的数据库名称与名称空间和上下文名称相匹配。

我还使用Application_Start()调用Global.asax.cs文件中的SetInitializer方法。我看到你在Session_Start()内部调用它。也许这就是问题所在。将您的代码更改为:

代码语言:javascript
复制
protected void Application_Start()
{
     System.Data.Entity.Database.SetInitializer(new R10491.Models.SampleData());
}

您还可以尝试调用Initialize方法:

代码语言:javascript
复制
protected void Application_Start()
{
     System.Data.Entity.Database.SetInitializer(new R10491.Models.SampleData());

     using (var context = new LibraryEntities())
     {
         context.Database.Initialize(true);
     }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14103636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档