C# 实体框架核心-数据库未填充
我试图用我的StoreInitializer填充数据库,但表是空的,我使用的是Entity Framework Core和ASP.NET Core,我想在Package Manager控制台中配置我的Initializer以使用更新数据库。我遵循了本教程,但在开始或更新时,数据库还是空的。VisualStudio没有显示任何错误 StoreInitializer.cs:C# 实体框架核心-数据库未填充,c#,asp.net,entity-framework,asp.net-core,C#,Asp.net,Entity Framework,Asp.net Core,我试图用我的StoreInitializer填充数据库,但表是空的,我使用的是Entity Framework Core和ASP.NET Core,我想在Package Manager控制台中配置我的Initializer以使用更新数据库。我遵循了本教程,但在开始或更新时,数据库还是空的。VisualStudio没有显示任何错误 StoreInitializer.cs: namespace PC_SHOP.DAL { public static class StoreInitialize
namespace PC_SHOP.DAL
{
public static class StoreInitializer
{
public static void Initialize(StoreContext context)
{
context.Database.EnsureCreated();
if (context.Electronics.Any())
{
return;
}
// Działy główne
var electronics = new Electronic[]
{
new Electronic { ID=1, Name = "Laptopy"},
new Electronic { ID=2, Name = "Komputery"},
new Electronic { ID=3, Name = "Części PC"},
new Electronic { ID=4, Name = "Dla graczy"},
new Electronic { ID=5, Name = "Peryferia PC"},
new Electronic { ID=6, Name = "Sieci i komunikacja"},
new Electronic { ID=7, Name = "Oprogramowanie"},
};
foreach (Electronic e in electronics)
{
context.Electronics.Add(e);
}
context.SaveChanges();
// Rodzaje laptopów
var laptops = new List<Laptop>
{
new Laptop { ID=1, Name = "Laptopy", ElectronicID = 1, IconFileName = "1_laptop.jpg"},
new Laptop { ID=2, Name = "Laptopy Apple", ElectronicID = 1, IconFileName = "2_apple.jpg"},
};
foreach (Laptop l in laptops)
{
context.Laptops.Add(l);
}
context.SaveChanges();
}
}
}
EnsureCreated可用于在原型设计和测试场景中创建数据库和表。它应该与迁移一起使用,而不是与迁移一起使用。只有当数据库不存在或不包含表时,它才会创建数据库。在其他情况下,它将一事无成 请注意,如果数据库存在,它将不会执行任何操作,因此需要使用不存在的数据库名称
实际上,您应该从comand行生成迁移,然后从初始值设定项运行迁移,而不是使用.recreated。“重新创建”用于每次创建的内存中数据库。ie原型制作。可在原型制作和测试场景中使用重新创建的数据库和表。它应该与迁移一起使用,而不是与迁移一起使用。只有当数据库不存在或不包含表时,它才会创建数据库。在其他情况下,它将一事无成 请注意,如果数据库存在,它将不会执行任何操作,因此需要使用不存在的数据库名称 实际上,您应该从comand行生成迁移,然后从初始值设定项运行迁移,而不是使用.recreated。“重新创建”用于每次创建的内存中数据库。ie原型设计。好的,我修复了 我在Startup.cs文件中添加了上下文参数来配置方法。其他一切都没有改变
public void Configure(IApplicationBuilder app, IHostingEnvironment env, StoreContext context )
{
...
//After app.UseMvc()
StoreInitializer.Initialize(context);
}
它正确地填充了我的数据库
我在Startup.cs文件中添加了上下文参数来配置方法。其他一切都没有改变
public void Configure(IApplicationBuilder app, IHostingEnvironment env, StoreContext context )
{
...
//After app.UseMvc()
StoreInitializer.Initialize(context);
}
它正确地填充了我的数据库将这一行添加到Program.cs Main()方法: StoreInitializer.Initialize(上下文)强>
public static void Main(string[] args)
{
//CreateWebHostBuilder(args).Build().Run();
var host = CreateWebHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var context = services.GetRequiredService<AppDbContext>();
//context.Database.EnsureCreated();
DbInitializer.Initialize(context);
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred creating the DB.");
}
}
host.Run();
}
publicstaticvoidmain(字符串[]args)
{
//CreateWebHostBuilder(args.Build().Run();
var host=CreateWebHostBuilder(args.Build();
使用(var scope=host.Services.CreateScope())
{
var services=scope.ServiceProvider;
尝试
{
var context=services.GetRequiredService();
//context.Database.recreated();
初始化(上下文);
}
捕获(例外情况除外)
{
var logger=services.GetRequiredService();
logger.LogError(例如,“创建数据库时出错”);
}
}
host.Run();
}
将此行添加到Program.cs Main()方法:
StoreInitializer.Initialize(上下文)强>
public static void Main(string[] args)
{
//CreateWebHostBuilder(args).Build().Run();
var host = CreateWebHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var context = services.GetRequiredService<AppDbContext>();
//context.Database.EnsureCreated();
DbInitializer.Initialize(context);
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred creating the DB.");
}
}
host.Run();
}
publicstaticvoidmain(字符串[]args)
{
//CreateWebHostBuilder(args.Build().Run();
var host=CreateWebHostBuilder(args.Build();
使用(var scope=host.Services.CreateScope())
{
var services=scope.ServiceProvider;
尝试
{
var context=services.GetRequiredService();
//context.Database.recreated();
初始化(上下文);
}
捕获(例外情况除外)
{
var logger=services.GetRequiredService();
logger.LogError(例如,“创建数据库时出错”);
}
}
host.Run();
}
您在哪里调用DbInitializer.Initialize()
?当程序在program.cs中使用method Main(描述中的watch link)启动时,或通过稍后使用Update database的迁移启动时,您是否确定已传递该方法且未发生异常?另外,您使用哪种方法来确保数据库是空的?我用myslef:)删除了它,并且没有填充新的数据库,vs2017显示我没有错误,更新显示消息:“完成”。当程序在program.cs中使用方法Main启动时,您在哪里调用DbInitializer.Initialize()
或者通过使用Update database Laters进行迁移您确定方法已通过并且没有异常发生吗?另外,您使用哪种方法来确保数据库是空的?我用myslef:)删除了它,并且没有填充新的数据库,vs2017显示我没有错误,更新显示消息:“完成”。我正在使用msn的教程,为什么在他们的数据库上工作??填充物呢?我已经删除了db,但没有结果,在clear db和Nothing上创建。我想你应该阅读整个系列,以正确的方式完成它,而不是一步一步地遵循每个教程。在同一系列的本教程中,我看到他们在迁移中正确地使用了相同的项目,但是如果数据库根本不存在,它应该可以工作,它应该创建并填充数据库。例如,它应该与内存中的提供程序一起工作,那么我做错了什么?它创建了表,但没有填充它们,我使用纯db进行操作,没有结果。您是否使用调试器检查了代码以确保它从代码中添加数据?DbContext通常是一个按请求作用域的服务,通常每个请求只调用一次savechanges,因此在添加所有数据后,我只会调用它一次。我仍然没有更改任何内容,只有一个添加到db的内容是迁移历史记录中的一条记录,没有其他内容,有什么想法吗?我用的是msn上的教程,为什么他们的db在工作??填充物呢?我已经删除了db,但没有结果,在clear db和Nothing上创建。我想你应该阅读整个系列,以正确的方式完成它,而不是一步一步地遵循每个教程。在同一系列的本教程中,我看到他们在迁移中正确地使用了同一个项目,但是如果数据库根本不存在,它应该可以工作,它应该创建数据库并进行迁移
public static void Main(string[] args)
{
//CreateWebHostBuilder(args).Build().Run();
var host = CreateWebHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var context = services.GetRequiredService<AppDbContext>();
//context.Database.EnsureCreated();
DbInitializer.Initialize(context);
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred creating the DB.");
}
}
host.Run();
}