Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# EF Code First DROPCreateDatabase始终未执行_C#_Entity Framework_Ef Code First - Fatal编程技术网

C# EF Code First DROPCreateDatabase始终未执行

C# EF Code First DROPCreateDatabase始终未执行,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我有一个测试应用程序,每次运行该应用程序时,我都希望删除并重新创建数据库。这是我的上下文类: public class MySolutionContext : DbContext { public MySolutionContext() : base("MySolution") { Database.SetInitializer<MySolutionContext>(new DropCreateDatabaseAlways());

我有一个测试应用程序,每次运行该应用程序时,我都希望删除并重新创建数据库。这是我的上下文类:

public class MySolutionContext : DbContext
{
    public MySolutionContext()
        : base("MySolution")
    {
        Database.SetInitializer<MySolutionContext>(new DropCreateDatabaseAlways());
    }

    public DbSet<Order> Orders { get; set; }
    public DbSet<OrderItem> OrderITems { get; set; }


    public void Seed(MySolutionContext context)
    {

        var order1 = new Order
        {
            Archive = false,
            CompletionDate = DateTime.Now,
            Person = "Bartosz"
        };
        var order2 = new Order
        {
            Archive = false,
            CompletionDate = DateTime.Now,
            Person = "Anna"
        };
        context.Orders.Add(order1);
        context.Orders.Add(order2);

        context.SaveChanges();
    }

    public class DropCreateDatabaseAlways : DropCreateDatabaseAlways<MySolutionContext>
    {
        protected override void Seed(MySolutionContext context)
        {
            context.Seed(context);
            base.Seed(context);
        }
    }
}
公共类MySolutionContext:DbContext
{
公共MySolutionContext()
:base(“MySolution”)
{
SetInitializer(新的DropCreateDatabaseAlways());
}
公共数据库集命令{get;set;}
公共数据库集OrderITems{get;set;}
公共void种子(MySolutionContext上下文)
{
var order1=新订单
{
存档=假,
CompletionDate=日期时间。现在,
Person=“Bartosz”
};
var order2=新订单
{
存档=假,
CompletionDate=日期时间。现在,
Person=“安娜”
};
context.Orders.Add(order1);
context.Orders.Add(order2);
SaveChanges();
}
公共类DropCreateDatabaseAlways:DropCreateDatabaseAlways
{
受保护的覆盖无效种子(MySolutionContext上下文)
{
上下文。种子(上下文);
种子(上下文);
}
}
}

当我第一次运行应用程序时,会执行Seed方法并创建数据库。然而,当我停止并重新运行应用程序时,Seed方法根本并没有启动,并且正在使用以前创建的数据库。为什么会这样?我的代码中缺少了什么

这里的问题是迁移在当前项目中被激活。与本文()相关,不可能同时使用migration“DropCreateDatabaseAlways”作为初始值设定项

如果您想使用迁移和“DropCreateDatabaseAlways”(除了测试之外,这是完全无用的),您必须编写自己的Init()方法,该方法在每个应用程序启动时删除并创建数据库

Database.Delete();
Database.Create();
但如果停用迁移,可以使用初始化器“DropCreateDatabaseAlways”

如果在没有迁移的情况下问题仍然存在,以下是一些如何解决此类问题的提示:

只有在使用数据库实例或数据库不存在时,才会执行初始值设定项。seed方法是初始值设定项的一部分,因此它不会被执行。要解决此问题,您可以通过访问部分数据来“处理”数据库,如:

context.Set<Entity>.Count(); 

希望这有帮助。

在测试项目中,我还需要在每次开始测试时删除数据库并重新创建所有内容

仅仅添加以下行是不够的:

Database.SetInitializer(new DropCreateDatabaseAlways<MyContext>());
Database.SetInitializer(新的DropCreateDatabaseAlways());
我对它进行了如下调整:

Database.SetInitializer(new DropCreateDatabaseAlways<ApsContext>());

using (MyContext context = new MyContext())
{
    context.Database.Delete();
}
Database.SetInitializer(新的DropCreateDatabaseAlways());
使用(MyContext context=new MyContext())
{
context.Database.Delete();
}

重要的是要知道,如果启用了迁移,则需要实际调用数据库来创建模式。我只是调用一个实体,试图查找Id=0的内容(因此它不返回任何内容)。

为什么您如此确定数据库没有重新创建?你是如何测试它的?我正在通过界面添加新订单这是一个web应用程序吗?如果是这样,请确保服务器(IIS/IIS Express)在执行之间确实停止。我使用LocalDB,它会改变什么吗?我使用本地IIS Web服务器并在调试模式下从VS运行应用程序您在某些问题上是对的,但更确切地说,是数据库。首次使用DbContext实例时会运行Initialize。或者当你直接调用它的时候。也就是说,确实需要用这两种方法之一初始化数据库。但是,如果您有一个“DropCreateDatabaseAlways”,它将始终删除并重新创建数据库。如果不是这样的话,那一定与迁移有关(但我认为不是这样)。如果您可以通过概念验证来检查是否存在与迁移的一些交互,那将非常有趣。我对此表示怀疑。如果您更新您的答案,并留下一条评论,我将向上投票。@JotaBe Thx感谢您的评论,可以肯定的是,您认为迁移与问题无关,初始值设定项不执行?如果这是你的问题,你读过我答案里面的文章吗?在那里,ET团队说,当使用“DropCreateDatabaseAlways”时,迁移是一个问题,我在我的项目中也认识到了这一点。我希望我正确理解了你的问题。是的,这是我的问题,这是一个很好的答案,但不能马上理解:有一个关于某个内容的解释,有一个编辑和更新,还有一个指向外部资源的链接,除非你打开它,否则它的内容是未知的。遗憾的是,由于这些细节,你的好答案毫无用处。不要担心完全重写它,或者复制+粘贴链接文章的内容,或者其中的一部分,简单解释一下里面的内容,告诉读者打开它了解细节。这将是一个极好的答案。请再编辑一次,“不要害怕改变一切”。干得好@感谢您的反馈,我将改进我的答案!起初,答案是对巴托斯在他的问题下最后一句话的回答,这就是为什么它如此令人困惑。现在我将改进答案,以便每个人都能理解它。又来了!
Database.SetInitializer(new DropCreateDatabaseAlways<ApsContext>());

using (MyContext context = new MyContext())
{
    context.Database.Delete();
}