Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.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# ASP.NET核心RC2种子数据库_C#_Asp.net Core_Entity Framework Core_Asp.net Core 1.0 - Fatal编程技术网

C# ASP.NET核心RC2种子数据库

C# ASP.NET核心RC2种子数据库,c#,asp.net-core,entity-framework-core,asp.net-core-1.0,C#,Asp.net Core,Entity Framework Core,Asp.net Core 1.0,我的问题是,我正试图用数据来创建一个实体框架核心数据库,在我看来,下面的代码展示了我的工作。我意识到这不应该在ApplicationDbContext构造函数中调用,而应该从启动中调用,但我不知道如何做到这一点 编辑:基于Ketrex提供的解决方案,我的解决方案如下: Startup.cs: public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactor

我的问题是,我正试图用数据来创建一个实体框架核心数据库,在我看来,下面的代码展示了我的工作。我意识到这不应该在
ApplicationDbContext
构造函数中调用,而应该从
启动
中调用,但我不知道如何做到这一点

编辑:基于Ketrex提供的解决方案,我的解决方案如下:

Startup.cs:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        ... 

        app.ApplicationServices.GetRequiredService<ApplicationDbContext>().Seed();
    }
我知道在EntityFramework的优先级列表中,创建一个数据库是非常重要的,但是如果有一些关于如何实现这个琐碎任务的文档,或者至少提供一个临时解决方案,那就太好了。如果有人能提供一些指导如何做到这一点,将不胜感激。我觉得我已经接近一个解决方案了,但就是不能把它拼凑起来


谢谢您的帮助。

假设您使用的是内置DI容器,这里有一种方法可以实现这一点

在启动类的Configure方法中引用种子方法,并将IAApplicationBuilder对象作为参数而不是DbContext传递,如下所示:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    //...
    // Put this at the end of your configure method
    DbContextSeedData.Seed(app);
}
public static void Seed(IApplicationBuilder app)
{
    // Get an instance of the DbContext from the DI container
    using (var context = app.ApplicationServices.GetRequiredService<ApplicationDbContext>())
    {
        // perform database delete
        context.Database.EnsureDeleted;
        //... perform other seed operations
    }
}
接下来,修改种子方法以接受IAApplicationBuilder实例。然后,您将能够启动DbContext的实例,并执行种子操作,如下所示:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    //...
    // Put this at the end of your configure method
    DbContextSeedData.Seed(app);
}
public static void Seed(IApplicationBuilder app)
{
    // Get an instance of the DbContext from the DI container
    using (var context = app.ApplicationServices.GetRequiredService<ApplicationDbContext>())
    {
        // perform database delete
        context.Database.EnsureDeleted;
        //... perform other seed operations
    }
}
publicstaticvoidseed(iaapplicationbuilder应用程序)
{
//从DI容器获取DbContext的实例
使用(var context=app.ApplicationServices.GetRequiredService())
{
//执行数据库删除
context.Database.cn已删除;
//…执行其他种子操作
}
}

您还可以使用Startup.cs
ConfigureServices
方法使ApplicationDbContext可用(将dbcontext注册为服务):

最后,seed方法可以对一个重要的表进行快速检查,因为重新创建数据库可能太重了:

public void Seed()
{
 //....      
 if(context.Countries.Any())
   return;
 //...
}

我希望它能帮助您或其他人,至少作为另一种选择。

如果您想从单独的类库运行EF代码并进行种子设定,您可以执行以下操作。这是使用TSQL

(一) 创建一个新类库。 使用NuGet添加以下依赖项

Microsoft.AspNetCore
Microsoft.AspNetCore.Identity.EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools
2) 将包管理器控制台指向此项目并运行

PM> add-migration Seeder01
然后

PM> update-database
这将为您提供一个空迁移

3) 将更新脚本编写为类似于

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Migrations;
using System;
using System.Collections.Generic;
using Microsoft.Extensions.Configuration;
using System.IO;

namespace Test02.Data.Migrations
{
    public partial class Seeder01 : Migration
    {

        protected override void Up(MigrationBuilder migrationBuilder)
        {
            string sql = string.Empty;

            sql = "SET IDENTITY_INSERT State ON;";
            sql += "Insert into State (Id, Name) values ";
            sql += "(2, 'NSW'),";
            sql += "(3, 'VIC'),";
            sql += "(4, 'QLD'),";
            sql += "(5, 'SA')";
            sql += ";";
            sql += "SET IDENTITY_INSERT State OFF;";
            migrationBuilder.Sql(sql);

        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            string sql = string.Empty;
            sql = "delete State;";
            migrationBuilder.Sql(sql);


        }
    }
}
4) 使用…还原到以前的迁移

PM> add-migration {PriorMigrationName}
重新加载种子迁移并更新数据库

PM> add-migration Seeder01
PM> update-database

非常感谢你!我缺少的是这一行
app.ApplicationServices.GetRequiredService()
。我稍微修改了您的解决方案,将其用作扩展方法。@MohammadAkbari您似乎在吹毛求疵。请注意//。。。是否执行其他种子操作?这显然意味着他可能还有其他手术要做。这里解决的问题是将上下文注入seed方法。请注意服务定位器反模式,但同时也有很好的解决方法。我期待EF Core获得更多功能,以便在产品中使用。我最终使用了
公共静态IApplicationBuilder种子(此IApplicationBuilder应用程序)
,这样我的初创公司就可以使用
app.Seed()我是一个非常新手,并且非常仔细地遵循这个字符串,但是不断地得到一个关于作用域的运行时错误。找到并进行了此更改(我使用的是core 2.1 RC)。公共静态IWebHost BuildWebHost(字符串[]args)=>WebHost.CreateDefaultBuilder(args)。UseStartup().UseDefaultServiceProvider(选项=>options.ValidateScopes=false)()
PM> add-migration Seeder01
PM> update-database