EnsureCreated 方法无法在数据库中创建新表

Hax*_*Hax 2 .net c# entity-framework-core

我正在使用context.Database.EnsureCreated();考虑 Mac OS 上的实体来自动映射和创建表。但是,它不会为新创建的新实体创建新表。

当我运行以下代码时,我在数据库中看到 3 个表。但是当我添加Battle.cs和取消注释时 -

public DbSet<Battle> Battles { get; set; }
Run Code Online (Sandbox Code Playgroud)

在 中DbContextcontext.Database.EnsureCreated();调用不会Battle在数据库中创建表。

楷模 -

public DbSet<Battle> Battles { get; set; }
Run Code Online (Sandbox Code Playgroud)

数据库上下文-

public class Samurai
{
    public Samurai()
    {
        Quotes = new List<Quote>();
    }
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Quote> Quotes { get; set; }
    public Clan Clan { get; set; }
}

public class Clan
{
    public int Id { get; set; }
    public string ClanName { get; set; }
}

public class Quote
{
    public int Id { get; set; }
    public string Text { get; set; }
    public Samurai Samurai { get; set; }
    public int SamuraiId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Battle模型 -

public class SamuraiContext : DbContext
{
    public DbSet<Samurai> Samurais { get; set; }
    public DbSet<Quote>   Quotes   { get; set; }
    public DbSet<Clan>   Clans   { get; set; }
    // public DbSet<Battle> Battles { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseMySQL(@"Server=localhost;port=3306;Database=exercise;Uid=root;Pwd=password;allowPublicKeyRetrieval=true;");
        base.OnConfiguring(optionsBuilder);
    }
}
Run Code Online (Sandbox Code Playgroud)

程序 -

public class Battle
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime StartDate { get; set;}
    public DateTime EndDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

MrV*_*ype 7

正如杰里米评论的那样,EnsureCreated()根本没有做你想做的事。从文档页面:

确保上下文的数据库存在。如果存在,则不 采取任何操作。如果它不存在,则创建数据库及其所有模式。如果数据库存在,则不会做出任何努力来确保它与此上下文的模型兼容。

EnsureCreated()例如,如果您要在内存 SQLite 数据库上进行集成测试,那么这非常有用。

通常,您希望通过运行 为当前模型生成架构dotnet ef migrations add <MigrationName>,然后如果您想以编程方式确保数据库反映当前架构,请调用database.Migrate()。当然你也可以dotnet ef database update从cli调用。

也就是说,如果您正在使用某种一次性数据库,并且您根本不想为生成架构或迁移而烦恼,那么......

database.EnsureDeleted();
database.EnsureCreated();
Run Code Online (Sandbox Code Playgroud)

...应该可以正常工作,因为这些Ensure*方法不依赖于迁移。

(我只是通过向 a 添加一个额外的实体DbContext,然后调用EnsureDeleted()后跟EnsureCreated(),而没有事先迁移来测试它,它确实重新创建了数据库,并为新实体提供了一个表。)

如果您还有其他问题,请随时发表评论,我会解决它们。:)