Microsoft.EntityFrameworkCore.Sqlite(2.0.0 peview1-final)迁移不创建表

时间:2017-06-02 22:27:05

标签: c# entity-framework asp.net-core entity-framework-core

我是Entity Framework的新手,在使用DB创建表时遇到了问题。

数据库创建正常但不会从实体创建表。

这是我的背景:

public class MyContext : DbContext
{
    public MyContext(DbContextOptions<MyContext> options) : base(options) { }

    public MyContext()
    {
    }

    public DbSet<User> Users { get; set; }

}

这里是User实体

public class User
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public string UsernaName {get; set;}
}

这是我在Startup.cs中的代码

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
        using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
        {
            var context = serviceScope.ServiceProvider.GetRequiredService<MyContext>();
            context.Database.Migrate();

        }
}

public void ConfigureServices(IServiceCollection services)
{
   services.AddIdentityServiceAuthentication();

   services.AddDbContext<MyContext>(options => options.UseSqlite(Configuration.GetConnectionString("SqlLiteConnection")));

   services.AddMvc();
 }

迁移创建数据库context.Database.Migrate();我从文档中可以清楚地看到这一点,但我不知道如何从实体创建表。

感谢您的帮助。

不确定是否重要,我的班级MyContext是在Class Libarry项目中定义的,而不是在Web项目中定义

修改

从@borisdj回答我发现我必须从包管理器运行此命令:

添加迁移MyFirstMigration -Context MyContext -Project MyProject.Db

但是我收到了这个错误:

  

没有为此DbContext配置数据库提供程序。可以通过覆盖DbContext.OnConfiguring方法或在应用程序服务提供程序上使用AddDbContext来配置提供程序。如果使用AddDbContext,那么还要确保您的DbContext类型在其构造函数中接受DbContextOptions对象,并将其传递给DbContext的基础构造函数。

正如您所看到的,我并未覆盖DbContext.OnConfiguring,但我在AddDbContext中使用Startup.cs正如您在上面所看到的那样,并且拥有接受DbContextOptions<TContext>对象的构造函数但我是仍然会收到此错误。

可能是因为MyContext在类库项目中定义而不是在Web项目中(Startup.cs所在的位置)

1 个答案:

答案 0 :(得分:2)

首先应在程序包管理器控制台中运行此命令:
PM&GT; add-migration初始 然后:
PM&GT;更新的数据库

如果App中有多个DbContext-s,则需要指定DbContext Name:
PM&GT; dd-migration Initial -Context MyContext -Project MyProject.Db

关于提供者的其他问题,您的应用中应该包含以下元素: 的 appsettings.json

"ConnectionStrings": {
    "DefaultConnection": "Server=localhost;Database=CoreTemplate;Trusted_Connection=True;MultipleActiveResultSets=true"

<强> Startup.cs

services.AddDbContext<MyContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

<强> MyContext.cs

public partial class My Context : DbContext
{
    public CoreTemplateContext(DbContextOptions options) : base(options) { }