Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';t获取实体框架MVC应用程序以将数据种子植入数据库_C#_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# Can';t获取实体框架MVC应用程序以将数据种子植入数据库

C# Can';t获取实体框架MVC应用程序以将数据种子植入数据库,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我承认在这个问题上有点疯狂,所以请容忍我。我已经试着做了5个小时了,现在我几乎只是把头撞在墙上。以下是我所拥有的: Global.asax.cs 名称空间MyApp { 公共类MVC应用程序:System.Web.HttpApplication { 受保护的无效应用程序\u Start() { SetInitializer(新的MyInitializer()); } } } MyInitializer.cs 名称空间MyApp.App\u开始 { 公共类MyInitializer:DropCr

我承认在这个问题上有点疯狂,所以请容忍我。我已经试着做了5个小时了,现在我几乎只是把头撞在墙上。以下是我所拥有的:

Global.asax.cs

名称空间MyApp
{
公共类MVC应用程序:System.Web.HttpApplication
{
受保护的无效应用程序\u Start()
{
SetInitializer(新的MyInitializer());
}
}
}
MyInitializer.cs

名称空间MyApp.App\u开始
{
公共类MyInitializer:DropCreateDatabaseIfModelChanges
{
受保护的覆盖无效种子(MyContext上下文)
{
//种子数据在这里
样本数据=新列表
{
新的MyModel{“foo”},
新MyModel{“bar”}
};
sample_data.ForEach(s=>context.MyModels.Add);
SaveChanges();
}
}
}
MyContext.cs

名称空间MyApp.Models
{
公共类MyContext:DbContext
{
public MyContext():base(“MyContext”)
{
SetInitializer(新的MyInitializer());
}
公共DbSet MyModels{get;set;}
}
}
Web.config

<appSettings>
    <add key="MyInitializer MyApp.Models.MyContext, MyApp.Models" value="MyApp.App_Start.MyInitializer, MyApp.Models" />
</appSettings>

我只是不明白为什么它没有播下任何数据。我在这里和其他地方读过十几个或更多类似的案例,几乎每一次迭代都尝试过,但仍然无法触发它。它甚至从未命中Seed()函数。数据库存在,如果我删除它,它将被重建,但从未填充

我倾向于我的web.config有问题,但我还没有找到答案。有什么建议吗?

根据,在您实际尝试访问数据库之前,不会调用DbInitializer

// Code copied from linked blog
static void Main(string[] args)
{
    Database.SetInitializer(new DropCreateDatabaseAlways<BlogContext>());
    using (var db = new BlogContext()) //initializer won't be called here
    {
        ...
        db.Categories.Add(cat); //initializer will be called here
        db.BlogPosts.Add(post);
        ...
    }
    Console.ReadLine();
}
//从链接博客复制的代码
静态void Main(字符串[]参数)
{
SetInitializer(新的DropCreateDatabaseAlways());
使用(var db=new BlogContext())//此处不会调用初始值设定项
{
...
db.Categories.Add(cat);//将在此处调用初始值设定项
db.BlogPosts.Add(post);
...
}
Console.ReadLine();
}

我解决了这个问题。显然,这个问题是双重的

  • 初始化器中的“DropCreateDatabaseIfModelChanges”没有启动,因为它没有看到模型已经更改。将此更改为“DropCreateDatabaseAlways”可以正常工作,但通常会导致“无法删除数据库,因为它当前正在使用”错误消息。手动断开数据库连接并重新启动VS通常可以解决这个问题,尽管我通常需要运行2-3次。一旦删除并重建了数据库,恢复到“DropCreateDatabaseIfModelChanges”会更快,并且仍然有效

  • 我的Web.config中可能缺少一行

    <appSettings>
        <add key="MyInitializer MyApp.Models.MyContext, MyApp.Models" value="MyApp.App_Start.MyInitializer, MyApp.Models" />
    </appSettings>
    
    
    

  • 在这两件事之间[嗯,更像是4件事],它现在似乎起作用了。

    您在使用迁移吗?请参见此处:是否将种子代码添加到正确的类?您的代码显示“new MyInitializer()”,但显示的类的名称是PropertyInitializer@Sam修正了。只是转录错误。我在MVC应用程序和非MVC应用程序之间转录时遇到问题。由于我不想在Global.asax.cs文件中单独添加每个项目,这对我有什么帮助?我认为种子覆盖的目的是为了不必这样做?种子覆盖是为了当数据库第一次被dbContext访问时,它可以进行特殊处理。在您的示例代码中,您实际上从未做过任何需要往返数据库的事情。